PySpark by Example

Setup environment

In [1]:
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate() 
spark
Out[1]:

SparkSession - in-memory

SparkContext

Spark UI

Version
v2.4.5
Master
local[*]
AppName
pyspark-shell
In [2]:
sc = spark.sparkContext
In [3]:
sc
Out[3]:

SparkContext

Spark UI

Version
v2.4.5
Master
local[*]
AppName
pyspark-shell

Downloading and preprocessing Chicago's Reported Crime Data

In [4]:
# !wget https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD
# !ls -l
In [5]:
# !mv rows.csv\?accessType\=DOWNLOAD data/reported-crimes.csv
# !ls -l
In [6]:
%time
from pyspark.sql.functions import to_timestamp,col,lit
rc = spark.read.csv('data/reported-crimes.csv',header=True).withColumn('Date',to_timestamp(col('Date'),'MM/dd/yyyy hh:mm:ss a')).filter(col('Date') <= lit('2018-11-11'))
rc.show(5)
CPU times: user 2 µs, sys: 0 ns, total: 2 µs
Wall time: 4.77 µs
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|      ID|Case Number|               Date|               Block|IUCR|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153| DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|           BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|              THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
only showing top 5 rows

In [7]:
rc.cache()
rc.count()
Out[7]:
6752020
In [8]:
!du -sh data/reported-crimes.csv
1.6G	data/reported-crimes.csv

Schemas

In [9]:
rc.printSchema()
root
 |-- ID: string (nullable = true)
 |-- Case Number: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Block: string (nullable = true)
 |-- IUCR: string (nullable = true)
 |-- Primary Type: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Location Description: string (nullable = true)
 |-- Arrest: string (nullable = true)
 |-- Domestic: string (nullable = true)
 |-- Beat: string (nullable = true)
 |-- District: string (nullable = true)
 |-- Ward: string (nullable = true)
 |-- Community Area: string (nullable = true)
 |-- FBI Code: string (nullable = true)
 |-- X Coordinate: string (nullable = true)
 |-- Y Coordinate: string (nullable = true)
 |-- Year: string (nullable = true)
 |-- Updated On: string (nullable = true)
 |-- Latitude: string (nullable = true)
 |-- Longitude: string (nullable = true)
 |-- Location: string (nullable = true)

In [10]:
from pyspark.sql.types import StructType, StructField, StringType, TimestampType, BooleanType, DoubleType, IntegerType
In [11]:
rc.columns
Out[11]:
['ID',
 'Case Number',
 'Date',
 'Block',
 'IUCR',
 'Primary Type',
 'Description',
 'Location Description',
 'Arrest',
 'Domestic',
 'Beat',
 'District',
 'Ward',
 'Community Area',
 'FBI Code',
 'X Coordinate',
 'Y Coordinate',
 'Year',
 'Updated On',
 'Latitude',
 'Longitude',
 'Location']
In [12]:
schema = StructType(
    [
    StructField('ID', StringType(), True),
    StructField('Case Number', StringType(), True),
    StructField('Date', TimestampType(), True),
    StructField('Block', StringType(), True),
    StructField('IUCR', StringType(), True),
    StructField('Primary Type', StringType(), True),
    StructField('Description', StringType(), True),
    StructField('Location Description', StringType(), True),
    StructField('Arrest', StringType(), True),
    StructField('Domestic', BooleanType(), True),
    StructField('Beat', StringType(), True),
    StructField('District', StringType(), True),
    StructField('Ward', StringType(), True),
    StructField('Community Area', StringType(), True),
    StructField('FBI Code', StringType(), True),
    StructField('X Coordinate', StringType(), True),
    StructField('Y Coordinate', StringType(), True),
    StructField('Year', IntegerType(), True),
    StructField('Updated On', StringType(), True),
    StructField('Latitude', DoubleType(), True),
    StructField('Longitude', DoubleType(), True),
    StructField('Location', StringType(), True)
    ]
)
In [13]:
schema
Out[13]:
StructType(List(StructField(ID,StringType,true),StructField(Case Number,StringType,true),StructField(Date,TimestampType,true),StructField(Block,StringType,true),StructField(IUCR,StringType,true),StructField(Primary Type,StringType,true),StructField(Description,StringType,true),StructField(Location Description,StringType,true),StructField(Arrest,StringType,true),StructField(Domestic,BooleanType,true),StructField(Beat,StringType,true),StructField(District,StringType,true),StructField(Ward,StringType,true),StructField(Community Area,StringType,true),StructField(FBI Code,StringType,true),StructField(X Coordinate,StringType,true),StructField(Y Coordinate,StringType,true),StructField(Year,IntegerType,true),StructField(Updated On,StringType,true),StructField(Latitude,DoubleType,true),StructField(Longitude,DoubleType,true),StructField(Location,StringType,true)))

Alternatively

In [14]:
labels = [
    ('ID', StringType()),
    ('Case Number', StringType()),
    ('Date', TimestampType()),
    ('Block', StringType()),
    ('IUCR', StringType()),
    ('Primary Type', StringType()),
    ('Description', StringType()),
    ('Location Description', StringType()),
    ('Arrest', StringType()),
    ('Domestic', BooleanType()),
    ('Beat', StringType()),
    ('District', StringType()),
    ('Ward', StringType()),
    ('Community Area', StringType()),
    ('FBI Code', StringType()),
    ('X Coordinate', StringType()),
    ('Y Coordinate', StringType()),
    ('Year', IntegerType()),
    ('Updated On', StringType()),
    ('Latitude', DoubleType()),
    ('Longitude', DoubleType()),
    ('Location', StringType())
]
In [15]:
schemaL = StructType([StructField(x[0], x[1], True) for x in labels] )
In [16]:
schemaL
Out[16]:
StructType(List(StructField(ID,StringType,true),StructField(Case Number,StringType,true),StructField(Date,TimestampType,true),StructField(Block,StringType,true),StructField(IUCR,StringType,true),StructField(Primary Type,StringType,true),StructField(Description,StringType,true),StructField(Location Description,StringType,true),StructField(Arrest,StringType,true),StructField(Domestic,BooleanType,true),StructField(Beat,StringType,true),StructField(District,StringType,true),StructField(Ward,StringType,true),StructField(Community Area,StringType,true),StructField(FBI Code,StringType,true),StructField(X Coordinate,StringType,true),StructField(Y Coordinate,StringType,true),StructField(Year,IntegerType,true),StructField(Updated On,StringType,true),StructField(Latitude,DoubleType,true),StructField(Longitude,DoubleType,true),StructField(Location,StringType,true)))
In [17]:
rcSchema = spark.read.csv('data/reported-crimes.csv',schema=schema)
rcSchema.printSchema()
root
 |-- ID: string (nullable = true)
 |-- Case Number: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Block: string (nullable = true)
 |-- IUCR: string (nullable = true)
 |-- Primary Type: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Location Description: string (nullable = true)
 |-- Arrest: string (nullable = true)
 |-- Domestic: boolean (nullable = true)
 |-- Beat: string (nullable = true)
 |-- District: string (nullable = true)
 |-- Ward: string (nullable = true)
 |-- Community Area: string (nullable = true)
 |-- FBI Code: string (nullable = true)
 |-- X Coordinate: string (nullable = true)
 |-- Y Coordinate: string (nullable = true)
 |-- Year: integer (nullable = true)
 |-- Updated On: string (nullable = true)
 |-- Latitude: double (nullable = true)
 |-- Longitude: double (nullable = true)
 |-- Location: string (nullable = true)

In [18]:
rcSchemaL = spark.read.csv('data/reported-crimes.csv',schema=schemaL)
rcSchemaL.printSchema()
root
 |-- ID: string (nullable = true)
 |-- Case Number: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Block: string (nullable = true)
 |-- IUCR: string (nullable = true)
 |-- Primary Type: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Location Description: string (nullable = true)
 |-- Arrest: string (nullable = true)
 |-- Domestic: boolean (nullable = true)
 |-- Beat: string (nullable = true)
 |-- District: string (nullable = true)
 |-- Ward: string (nullable = true)
 |-- Community Area: string (nullable = true)
 |-- FBI Code: string (nullable = true)
 |-- X Coordinate: string (nullable = true)
 |-- Y Coordinate: string (nullable = true)
 |-- Year: integer (nullable = true)
 |-- Updated On: string (nullable = true)
 |-- Latitude: double (nullable = true)
 |-- Longitude: double (nullable = true)
 |-- Location: string (nullable = true)

But BEWARE

In [19]:
rcSchema.show(5)
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
|  ID|Case Number|Date|Block|IUCR|Primary Type|Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|Updated On|Latitude|Longitude|Location|
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
only showing top 5 rows

In [20]:
rcSchemaL.show(5)
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
|  ID|Case Number|Date|Block|IUCR|Primary Type|Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|Updated On|Latitude|Longitude|Location|
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
|null|       null|null| null|null|        null|       null|                null|  null|    null|null|    null|null|          null|    null|        null|        null|null|      null|    null|     null|    null|
+----+-----------+----+-----+----+------------+-----------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------+--------+---------+--------+
only showing top 5 rows

In [21]:
rc = spark.read.csv('data/reported-crimes.csv',header=True).withColumn('Date',to_timestamp(col('Date'),'MM/dd/yyyy hh:mm:ss a')).filter(col('Date') <= lit('2018-11-11'))
rc.show(5)
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|      ID|Case Number|               Date|               Block|IUCR|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153| DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|           BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|              THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
only showing top 5 rows

Working with columns

Display only the first 5 rows of the column name IUCR

In [22]:
rc.select('IUCR').show(5)
+----+
|IUCR|
+----+
|1153|
|0281|
|0620|
|0810|
|0281|
+----+
only showing top 5 rows

In [23]:
rc.select(rc.IUCR).show(5)
+----+
|IUCR|
+----+
|1153|
|0281|
|0620|
|0810|
|0281|
+----+
only showing top 5 rows

In [24]:
rc.select(col('IUCR')).show(5)
+----+
|IUCR|
+----+
|1153|
|0281|
|0620|
|0810|
|0281|
+----+
only showing top 5 rows

Display only the first 4 rows of the column names Case Number, Date and Arrest

In [25]:
rc.select('Case Number', 'Date', 'Arrest').show(4)
+-----------+-------------------+------+
|Case Number|               Date|Arrest|
+-----------+-------------------+------+
|   JA366925|2001-01-01 11:00:00| false|
|   JB147188|2017-10-08 03:00:00| false|
|   JB147595|2017-03-28 14:00:00| false|
|   JB147230|2017-09-09 20:17:00| false|
+-----------+-------------------+------+
only showing top 4 rows

Add a column with name One, with entries all 1s

In [26]:
from pyspark.sql.functions import lit
In [27]:
rc.withColumn('One', lit(1)).show(5)
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+---+
|      ID|Case Number|               Date|               Block|IUCR|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|One|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+---+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153| DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|  1|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|  1|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|           BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|  1|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|              THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|  1|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|  1|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+---+
only showing top 5 rows

Remove the column IUCR

In [28]:
rcDropped = rc.drop('IUCR')
rcDropped.show(5)
+--------+-----------+-------------------+--------------------+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|      ID|Case Number|               Date|               Block|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|
+--------+-----------+-------------------+--------------------+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL| DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|           BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|              THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
+--------+-----------+-------------------+--------------------+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
only showing top 5 rows

Working with rows

Add the reported crimes for an additional day, 12-Nov-2018, to our dataset.

In [29]:
oneDay = spark.read.format("csv").\
            option("header", "true").\
            load('data/reported-crimes.csv').\
            withColumn('Date',to_timestamp(col('Date'),'MM/dd/yyyy hh:mm:ss a')).\
            filter(col('Date') == lit('2018-11-12'))
            
oneDay.show()
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|      ID|Case Number|               Date|              Block|IUCR|      Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|    Latitude|    Longitude|            Location|
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|11505149|   JB513151|2018-11-12 00:00:00| 003XX S WHIPPLE ST|0810|             THEFT|           OVER $500|              STREET| false|   false|1124|     011|  28|            27|      06|     1156099|     1898319|2018|11/19/2018 04:22:...|41.876776356|-87.702317641|(41.876776356, -8...|
|11516594|   JB528186|2018-11-12 00:00:00|049XX S PRAIRIE AVE|2826|     OTHER OFFENSE|HARASSMENT BY ELE...|               OTHER| false|   false|0224|     002|   3|            38|      26|     1178879|     1872259|2018|11/28/2018 04:14:...|41.804775828|-87.619472488|(41.804775828, -8...|
|11540042|   JB559262|2018-11-12 00:00:00|010XX N DEARBORN ST|1140|DECEPTIVE PRACTICE|        EMBEZZLEMENT|   CONVENIENCE STORE|  true|   false|1824|     018|   2|             8|      12|     1175747|     1907348|2018|03/16/2019 04:01:...|41.901133376|-87.629904979|(41.901133376, -8...|
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+

In [30]:
oneDayWhere = spark.read.format("csv").\
            option("header", "true").\
            option("inferSchema", "true").\
            load('data/reported-crimes.csv').\
            withColumn('Date',to_timestamp(col('Date'),'MM/dd/yyyy hh:mm:ss a')).\
            where(col('Date') == lit('2018-11-12'))
            
oneDayWhere.show()
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|      ID|Case Number|               Date|              Block|IUCR|      Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|    Latitude|    Longitude|            Location|
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|11505149|   JB513151|2018-11-12 00:00:00| 003XX S WHIPPLE ST|0810|             THEFT|           OVER $500|              STREET| false|   false|1124|      11|  28|            27|      06|     1156099|     1898319|2018|11/19/2018 04:22:...|41.876776356|-87.702317641|(41.876776356, -8...|
|11516594|   JB528186|2018-11-12 00:00:00|049XX S PRAIRIE AVE|2826|     OTHER OFFENSE|HARASSMENT BY ELE...|               OTHER| false|   false| 224|       2|   3|            38|      26|     1178879|     1872259|2018|11/28/2018 04:14:...|41.804775828|-87.619472488|(41.804775828, -8...|
|11540042|   JB559262|2018-11-12 00:00:00|010XX N DEARBORN ST|1140|DECEPTIVE PRACTICE|        EMBEZZLEMENT|   CONVENIENCE STORE|  true|   false|1824|      18|   2|             8|      12|     1175747|     1907348|2018|03/16/2019 04:01:...|41.901133376|-87.629904979|(41.901133376, -8...|
+--------+-----------+-------------------+-------------------+----+------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+

In [31]:
oneDay.count()
Out[31]:
3
In [32]:
oneDay.printSchema()
root
 |-- ID: string (nullable = true)
 |-- Case Number: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Block: string (nullable = true)
 |-- IUCR: string (nullable = true)
 |-- Primary Type: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Location Description: string (nullable = true)
 |-- Arrest: string (nullable = true)
 |-- Domestic: string (nullable = true)
 |-- Beat: string (nullable = true)
 |-- District: string (nullable = true)
 |-- Ward: string (nullable = true)
 |-- Community Area: string (nullable = true)
 |-- FBI Code: string (nullable = true)
 |-- X Coordinate: string (nullable = true)
 |-- Y Coordinate: string (nullable = true)
 |-- Year: string (nullable = true)
 |-- Updated On: string (nullable = true)
 |-- Latitude: string (nullable = true)
 |-- Longitude: string (nullable = true)
 |-- Location: string (nullable = true)

In [33]:
rc.printSchema()
root
 |-- ID: string (nullable = true)
 |-- Case Number: string (nullable = true)
 |-- Date: timestamp (nullable = true)
 |-- Block: string (nullable = true)
 |-- IUCR: string (nullable = true)
 |-- Primary Type: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Location Description: string (nullable = true)
 |-- Arrest: string (nullable = true)
 |-- Domestic: string (nullable = true)
 |-- Beat: string (nullable = true)
 |-- District: string (nullable = true)
 |-- Ward: string (nullable = true)
 |-- Community Area: string (nullable = true)
 |-- FBI Code: string (nullable = true)
 |-- X Coordinate: string (nullable = true)
 |-- Y Coordinate: string (nullable = true)
 |-- Year: string (nullable = true)
 |-- Updated On: string (nullable = true)
 |-- Latitude: string (nullable = true)
 |-- Longitude: string (nullable = true)
 |-- Location: string (nullable = true)

In [34]:
oneDay.count()
Out[34]:
3
In [35]:
rc.union(oneDay).show(5)
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|      ID|Case Number|               Date|               Block|IUCR|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153| DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|           BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|              THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281|CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+
only showing top 5 rows

In [36]:
rc.union(oneDay).orderBy('Date', ascending=False).show(5)
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|      ID|Case Number|               Date|               Block|IUCR|       Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|    Latitude|    Longitude|            Location|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
|11505149|   JB513151|2018-11-12 00:00:00|  003XX S WHIPPLE ST|0810|              THEFT|           OVER $500|              STREET| false|   false|1124|     011|  28|            27|      06|     1156099|     1898319|2018|11/19/2018 04:22:...|41.876776356|-87.702317641|(41.876776356, -8...|
|11516594|   JB528186|2018-11-12 00:00:00| 049XX S PRAIRIE AVE|2826|      OTHER OFFENSE|HARASSMENT BY ELE...|               OTHER| false|   false|0224|     002|   3|            38|      26|     1178879|     1872259|2018|11/28/2018 04:14:...|41.804775828|-87.619472488|(41.804775828, -8...|
|11540042|   JB559262|2018-11-12 00:00:00| 010XX N DEARBORN ST|1140| DECEPTIVE PRACTICE|        EMBEZZLEMENT|   CONVENIENCE STORE|  true|   false|1824|     018|   2|             8|      12|     1175747|     1907348|2018|03/16/2019 04:01:...|41.901133376|-87.629904979|(41.901133376, -8...|
|11504330|   JB512058|2018-11-10 23:55:00|021XX W GREENLEAF...|0820|              THEFT|      $500 AND UNDER|              STREET| false|   false|2411|     024|  50|             2|      06|     1160583|     1946926|2018|11/17/2018 04:14:...|42.010065214|-87.684502849|(42.010065214, -8...|
|11503920|   JB511504|2018-11-10 23:53:00|081XX S HERMITAGE...|0910|MOTOR VEHICLE THEFT|          AUTOMOBILE|           APARTMENT| false|   false|0614|     006|  21|            71|      07|     1166095|     1850727|2018|11/17/2018 04:14:...|41.745971025|-87.666970419|(41.745971025, -8...|
+--------+-----------+-------------------+--------------------+----+-------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+------------+-------------+--------------------+
only showing top 5 rows

What are the top 10 number of reported crimes by Primary type, in descending order of occurence?

Along with a groupBy() there needs to be an aggregation along with it

In [37]:
rc.groupBy('Primary Type').count().show()
+--------------------+-------+
|        Primary Type|  count|
+--------------------+-------+
|OFFENSE INVOLVING...|  45709|
|CRIMINAL SEXUAL A...|    333|
|            STALKING|   3384|
|PUBLIC PEACE VIOL...|  47780|
|           OBSCENITY|    582|
|NON-CRIMINAL (SUB...|      9|
|               ARSON|  11154|
|   DOMESTIC VIOLENCE|      1|
|            GAMBLING|  14422|
|   CRIMINAL TRESPASS| 193358|
|             ASSAULT| 418479|
|      NON - CRIMINAL|     38|
|LIQUOR LAW VIOLATION|  14063|
| MOTOR VEHICLE THEFT| 314101|
|               THEFT|1418293|
|             BATTERY|1232001|
|             ROBBERY| 255566|
|            HOMICIDE|   9463|
|           RITUALISM|     23|
|    PUBLIC INDECENCY|    161|
+--------------------+-------+
only showing top 20 rows

In [38]:
rc.groupBy('Primary Type').count().orderBy('count', ascending=False).show()
+--------------------+-------+
|        Primary Type|  count|
+--------------------+-------+
|               THEFT|1418293|
|             BATTERY|1232001|
|     CRIMINAL DAMAGE| 771399|
|           NARCOTICS| 711609|
|       OTHER OFFENSE| 418802|
|             ASSAULT| 418479|
|            BURGLARY| 388009|
| MOTOR VEHICLE THEFT| 314101|
|  DECEPTIVE PRACTICE| 265567|
|             ROBBERY| 255566|
|   CRIMINAL TRESPASS| 193358|
|   WEAPONS VIOLATION|  70656|
|        PROSTITUTION|  68324|
|PUBLIC PEACE VIOL...|  47780|
|OFFENSE INVOLVING...|  45709|
| CRIM SEXUAL ASSAULT|  27081|
|         SEX OFFENSE|  25304|
|INTERFERENCE WITH...|  15135|
|            GAMBLING|  14422|
|LIQUOR LAW VIOLATION|  14063|
+--------------------+-------+
only showing top 20 rows

Challenge questions

What percentage of reported crimes resulted in an arrest?

In [39]:
rc.select('Arrest').distinct().show(5)
+------+
|Arrest|
+------+
| false|
|  true|
+------+

In [40]:
rc.where(col('Arrest') == 'true').count() / rc.select('Arrest').count()
Out[40]:
0.2775467193521346

What are the top 3 locations for reported crimes?

In [41]:
locArrAll = rc.groupBy('Location Description').count().orderBy('count', ascending=False).show(3)
+--------------------+-------+
|Location Description|  count|
+--------------------+-------+
|              STREET|1770359|
|           RESIDENCE|1144528|
|           APARTMENT| 698091|
+--------------------+-------+
only showing top 3 rows

In [42]:
locArrTrue = rc.select('Arrest', 'Location').where(col('Arrest') == 'true').groupBy('Location').count().orderBy('count', ascending=False)
locArrTrue.count()
Out[42]:
435860

Built-in functions

In [43]:
from pyspark.sql import functions
In [44]:
print(len(dir(functions)))
248

String functions

Display the Primary Type column in lower and upper characters, and the first 4 characters of the column

In [45]:
from pyspark.sql.functions import lower, upper, substring
In [46]:
help(substring)
Help on function substring in module pyspark.sql.functions:

substring(str, pos, len)
    Substring starts at `pos` and is of length `len` when str is String type or
    returns the slice of byte array that starts at `pos` in byte and is of length `len`
    when str is Binary type.
    
    .. note:: The position is not zero based, but 1 based index.
    
    >>> df = spark.createDataFrame([('abcd',)], ['s',])
    >>> df.select(substring(df.s, 1, 2).alias('s')).collect()
    [Row(s='ab')]
    
    .. versionadded:: 1.5

In [47]:
rc.select(col('Primary Type'), lower(col('Primary Type')),upper(col('Primary Type')),substring(col('Primary Type'), 1, 4)).show(5)
+-------------------+-------------------+-------------------+-----------------------------+
|       Primary Type|lower(Primary Type)|upper(Primary Type)|substring(Primary Type, 1, 4)|
+-------------------+-------------------+-------------------+-----------------------------+
| DECEPTIVE PRACTICE| deceptive practice| DECEPTIVE PRACTICE|                         DECE|
|CRIM SEXUAL ASSAULT|crim sexual assault|CRIM SEXUAL ASSAULT|                         CRIM|
|           BURGLARY|           burglary|           BURGLARY|                         BURG|
|              THEFT|              theft|              THEFT|                         THEF|
|CRIM SEXUAL ASSAULT|crim sexual assault|CRIM SEXUAL ASSAULT|                         CRIM|
+-------------------+-------------------+-------------------+-----------------------------+
only showing top 5 rows

Numeric functions

Show the oldest date and the most recent date

In [48]:
from pyspark.sql.functions import min as smin, max as smax
In [49]:
rc.select(smin(col('Date')), smax(col('Date'))).show(1)
+-------------------+-------------------+
|          min(Date)|          max(Date)|
+-------------------+-------------------+
|2001-01-01 00:00:00|2018-11-10 23:55:00|
+-------------------+-------------------+

Date

What is 3 days earlier that the oldest date and 3 days later than the most recent date?

In [50]:
from pyspark.sql.functions import date_add, date_sub
In [51]:
help(date_add)
Help on function date_add in module pyspark.sql.functions:

date_add(start, days)
    Returns the date that is `days` days after `start`
    
    >>> df = spark.createDataFrame([('2015-04-08',)], ['dt'])
    >>> df.select(date_add(df.dt, 1).alias('next_date')).collect()
    [Row(next_date=datetime.date(2015, 4, 9))]
    
    .. versionadded:: 1.5

In [52]:
rc.select(date_sub(smin(col('Date')), 3), date_add(smax(col('Date')), 3)).show(1)
+----------------------+----------------------+
|date_sub(min(Date), 3)|date_add(max(Date), 3)|
+----------------------+----------------------+
|            2000-12-29|            2018-11-13|
+----------------------+----------------------+

Working with dates

Defining dates means defining a pattern string of the form: https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

In [53]:
from pyspark.sql.functions import to_date, to_timestamp, lit

2019-12-25 13:30:00

In [54]:
df = spark.createDataFrame([("2019-12-25 13:30:00",)],["Christmas"])
df.show()
+-------------------+
|          Christmas|
+-------------------+
|2019-12-25 13:30:00|
+-------------------+

In [55]:
df.select(to_date(col("Christmas"), "yyyy-MM-dd HH:mm:ss"), to_timestamp(col("Christmas"),"yyyy-MM-dd HH:mm:ss")).show()
+-------------------------------------------+------------------------------------------------+
|to_date(`Christmas`, 'yyyy-MM-dd HH:mm:ss')|to_timestamp(`Christmas`, 'yyyy-MM-dd HH:mm:ss')|
+-------------------------------------------+------------------------------------------------+
|                                 2019-12-25|                             2019-12-25 13:30:00|
+-------------------------------------------+------------------------------------------------+

25/Dec/2019 13:30:00

In [56]:
df = spark.createDataFrame([("25/Dec/2019 13:30:00",)],["Christmas"])
df.show()
+--------------------+
|           Christmas|
+--------------------+
|25/Dec/2019 13:30:00|
+--------------------+

In [57]:
df.select(to_date(col("Christmas"), "dd/MMM/yyyy HH:mm:ss"), to_timestamp(col("Christmas"),"dd/MMM/yyyy HH:mm:ss")).show()
+--------------------------------------------+-------------------------------------------------+
|to_date(`Christmas`, 'dd/MMM/yyyy HH:mm:ss')|to_timestamp(`Christmas`, 'dd/MMM/yyyy HH:mm:ss')|
+--------------------------------------------+-------------------------------------------------+
|                                  2019-12-25|                              2019-12-25 13:30:00|
+--------------------------------------------+-------------------------------------------------+

12/25/2019 01:30:00 PM

In [58]:
df = spark.createDataFrame([("12/25/2019 01:30:00 PM",)],["Christmas"])
df.show(1, truncate=False)
+----------------------+
|Christmas             |
+----------------------+
|12/25/2019 01:30:00 PM|
+----------------------+

In [59]:
df.select(to_date(col("Christmas"), "MM/dd/yyyy hh:mm:ss aa"), to_timestamp(col("Christmas"),"MM/dd/yyyy hh:mm:ss aa")).show()
+----------------------------------------------+---------------------------------------------------+
|to_date(`Christmas`, 'MM/dd/yyyy hh:mm:ss aa')|to_timestamp(`Christmas`, 'MM/dd/yyyy hh:mm:ss aa')|
+----------------------------------------------+---------------------------------------------------+
|                                    2019-12-25|                                2019-12-25 13:30:00|
+----------------------------------------------+---------------------------------------------------+

In [60]:
nrc = spark.read.csv("data/reported-crimes.csv", header=True)
nrc.show(5, truncate=False)
+--------+-----------+----------------------+--------------------+----+-------------------+-----------------------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+--------+---------+--------+
|ID      |Case Number|Date                  |Block               |IUCR|Primary Type       |Description                        |Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|Updated On            |Latitude|Longitude|Location|
+--------+-----------+----------------------+--------------------+----+-------------------+-----------------------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+--------+---------+--------+
|11034701|JA366925   |01/01/2001 11:00:00 AM|016XX E 86TH PL     |1153|DECEPTIVE PRACTICE |FINANCIAL IDENTITY THEFT OVER $ 300|RESIDENCE           |false |false   |0412|004     |8   |45            |11      |null        |null        |2001|08/05/2017 03:50:08 PM|null    |null     |null    |
|11227287|JB147188   |10/08/2017 03:00:00 AM|092XX S RACINE AVE  |0281|CRIM SEXUAL ASSAULT|NON-AGGRAVATED                     |RESIDENCE           |false |false   |2222|022     |21  |73            |02      |null        |null        |2017|02/11/2018 03:57:41 PM|null    |null     |null    |
|11227583|JB147595   |03/28/2017 02:00:00 PM|026XX W 79TH ST     |0620|BURGLARY           |UNLAWFUL ENTRY                     |OTHER               |false |false   |0835|008     |18  |70            |05      |null        |null        |2017|02/11/2018 03:57:41 PM|null    |null     |null    |
|11227293|JB147230   |09/09/2017 08:17:00 PM|060XX S EBERHART AVE|0810|THEFT              |OVER $500                          |RESIDENCE           |false |false   |0313|003     |20  |42            |06      |null        |null        |2017|02/11/2018 03:57:41 PM|null    |null     |null    |
|11227634|JB147599   |08/26/2017 10:00:00 AM|001XX W RANDOLPH ST |0281|CRIM SEXUAL ASSAULT|NON-AGGRAVATED                     |HOTEL/MOTEL         |false |false   |0122|001     |42  |32            |02      |null        |null        |2017|02/11/2018 03:57:41 PM|null    |null     |null    |
+--------+-----------+----------------------+--------------------+----+-------------------+-----------------------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+--------+---------+--------+
only showing top 5 rows

UDFs (User-Defined-Functions)

You won't be surprised to hear that you can also create your own functions, and these functions will be applied across your data row by row. Now, there's a really good reason why we focused on the built-in functions first before looking at these UDFs, or user-defined functions. This is because there are performance considerations that we need to be aware of. Now, once you create your function, you need to register it with Spark for it to be used on all the worker nodes. It doesn't matter what language you've used, so that's if your code is in Python, Scala, or any other supported language, the next thing Spark needs to do is to serialize the function on the driver and then send it out to all of the executor processes. When you use the function and it's written in Scala or Java, you can use it within the Java virtual machine, or JVM. This means there's little performance penalty. You still don't get the full benefits that Spark has for the built-in functions that we looked at earlier, but there isn't a bit hit on the performance. Things get a lot more interesting when it comes to Python. Spark will start a Python process on the worker, so as usual, the first step is to get the function serialized and sent to the worker nodes. Spark then has to start the Python process and send the data across. So in our case, it'll take whatever data set we're using and apply the function row by row on the data set, and then returns these row operations to the JVM in Spark. Now remember that earlier in the course, when we were looking at Spark sessions, we said that PySpark is actually a wrapper around the spark core. When you start your Spark session in Python, in the background, PySpark uses Py4J to launch a JVM and create a JavaSparkContext. So the real performance hit is in serializing the data to Python. You can imagine that this will be an expensive computation. But the bigger challenge is that when the data enters the Python process, then Spark doesn't have any control over the memory of the worker. So you can easily end up in a situation where a worker fails, simply because both Python and the JVM are competing for memory for that worker node. So basically, as long as we avoid all kind of Python user-defined functions, a PySpark program will be approximately as fast as a Spark program based on Scala. So what are our options around this performance bottleneck? Well, one option is, if you have to write your function, write it in Scala or Java. We can still access and use this function from Python. Wes McKinney, the creator of Pandas has been working on the general problem of accessing data frames from different programming languages in the Apache Arrow project. This tries to standardize the way data in columns is stored in memory, so you don't have this object translation by serialization and de-serialization anymore. This should drastically speed up our Python UDFs. Your preference should always be to use the built-in Spark functions whenever possible.

# Compatibiliy Setting for PyArrow >= 0.15.0 and Spark 2.3.x, 2.4.x
# Since Arrow 0.15.0, a change in the binary IPC format requires an environment variable to be
# compatible with previous versions of Arrow <= 0.14.1. This is only necessary to do for PySpark users
# with versions 2.3.x and 2.4.x that have manually upgraded PyArrow to 0.15.0. The following can be
# added to conf/spark-env.sh to use the legacy Arrow IPC format:
ARROW_PRE_0_15_IPC_FORMAT=1
# This will instruct PyArrow >= 0.15.0 to use the legacy IPC format with the older Arrow Java that is
# in Spark 2.3.x and 2.4.x. Not setting this environment variable will lead to a similar error as
# described in SPARK-29367 when running pandas_udfs or toPandas() with Arrow enabled. More information
# about the Arrow IPC change can be read on the Arrow 0.15.0 release blog.
# REF:
# https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#compatibiliy-setting-for-pyarrow--0150-and-spark-23x-24x

Joins

In [61]:
!ls
PySpark-by-Example.ipynb  data	html  imgs
In [62]:
# ![title]("img/picture.png")

Download police station data

In [63]:
# !wget -O data/police-stations.csv https://data.cityofchicago.org/api/views/z8bn-74gv/rows.csv?accessType=DOWNLOAD
# !ls -l data/

The reported crimes dataset has only the district number. Add the district name by joining with the police station dataset

In [64]:
ps = spark.read.csv("data/police-stations.csv", header=True)
ps.show(5, truncate=False)
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+
|DISTRICT    |DISTRICT NAME |ADDRESS             |CITY   |STATE|ZIP  |WEBSITE                                                                        |PHONE       |FAX         |TTY         |X COORDINATE|Y COORDINATE|LATITUDE   |LONGITUDE   |LOCATION                       |
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+
|Headquarters|Headquarters  |3510 S Michigan Ave |Chicago|IL   |60653|http://home.chicagopolice.org                                                  |null        |null        |null        |1177731.401 |1881697.404 |41.83070169|-87.62339535|(41.8307016873, -87.6233953459)|
|1           |Central       |1718 S State St     |Chicago|IL   |60616|http://home.chicagopolice.org/community/districts/1st-district-central/        |312-745-4290|312-745-3694|312-745-3693|1176569.052 |1891771.704 |41.85837259|-87.62735617|(41.8583725929, -87.627356171) |
|6           |Gresham       |7808 S Halsted St   |Chicago|IL   |60620|http://home.chicagopolice.org/community/districts/6th-district-gresham/        |312-745-3617|312-745-3649|312-745-3639|1172283.013 |1853022.646 |41.75213684|-87.64422891|(41.7521368378, -87.6442289066)|
|11          |Harrison      |3151 W Harrison St  |Chicago|IL   |60612|http://home.chicagopolice.org/community/districts/11th-district-harrison/      |312-746-8386|312-746-4281|312-746-5151|1155244.069 |1897148.755 |41.87358229|-87.70548813|(41.8735822883, -87.705488126) |
|16          |Jefferson Park|5151 N Milwaukee Ave|Chicago|IL   |60630|http://home.chicagopolice.org/community/districts/16th-district-jefferson-park/|312-742-4480|312-742-4421|312-742-4423|1138480.758 |1933660.473 |41.97409445|-87.76614884|(41.9740944511, -87.7661488432)|
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+
only showing top 5 rows

In [65]:
ps.select(col('DISTRICT')).distinct().show(20)
+------------+
|    DISTRICT|
+------------+
|           7|
|          15|
|          11|
|           3|
|           8|
|          22|
|          16|
|           5|
|          18|
|          17|
|           6|
|          19|
|          25|
|Headquarters|
|          24|
|           9|
|           1|
|          20|
|          10|
|           4|
+------------+
only showing top 20 rows

In [66]:
rc.select('District').distinct().show(20)
+--------+
|District|
+--------+
|     009|
|     012|
|     024|
|    null|
|     031|
|     015|
|     006|
|     019|
|     020|
|     011|
|     025|
|     003|
|     005|
|     016|
|     018|
|     008|
|     022|
|     001|
|     014|
|     010|
+--------+
only showing top 20 rows

In [67]:
from pyspark.sql.functions import lpad
In [68]:
help(lpad)
Help on function lpad in module pyspark.sql.functions:

lpad(col, len, pad)
    Left-pad the string column to width `len` with `pad`.
    
    >>> df = spark.createDataFrame([('abcd',)], ['s',])
    >>> df.select(lpad(df.s, 6, '#').alias('s')).collect()
    [Row(s='##abcd')]
    
    .. versionadded:: 1.5

In [69]:
ps.select(lpad(col("DISTRICT"), 3, "0")).show()
+--------------------+
|lpad(DISTRICT, 3, 0)|
+--------------------+
|                 Hea|
|                 001|
|                 006|
|                 011|
|                 016|
|                 024|
|                 002|
|                 007|
|                 025|
|                 010|
|                 015|
|                 003|
|                 019|
|                 014|
|                 008|
|                 004|
|                 020|
|                 018|
|                 012|
|                 ",C|
+--------------------+
only showing top 20 rows

In [70]:
ps = ps.withColumn("Format District", lpad(col("DISTRICT"), 3, "0"))
ps.show(5, truncate=False)
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+---------------+
|DISTRICT    |DISTRICT NAME |ADDRESS             |CITY   |STATE|ZIP  |WEBSITE                                                                        |PHONE       |FAX         |TTY         |X COORDINATE|Y COORDINATE|LATITUDE   |LONGITUDE   |LOCATION                       |Format District|
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+---------------+
|Headquarters|Headquarters  |3510 S Michigan Ave |Chicago|IL   |60653|http://home.chicagopolice.org                                                  |null        |null        |null        |1177731.401 |1881697.404 |41.83070169|-87.62339535|(41.8307016873, -87.6233953459)|Hea            |
|1           |Central       |1718 S State St     |Chicago|IL   |60616|http://home.chicagopolice.org/community/districts/1st-district-central/        |312-745-4290|312-745-3694|312-745-3693|1176569.052 |1891771.704 |41.85837259|-87.62735617|(41.8583725929, -87.627356171) |001            |
|6           |Gresham       |7808 S Halsted St   |Chicago|IL   |60620|http://home.chicagopolice.org/community/districts/6th-district-gresham/        |312-745-3617|312-745-3649|312-745-3639|1172283.013 |1853022.646 |41.75213684|-87.64422891|(41.7521368378, -87.6442289066)|006            |
|11          |Harrison      |3151 W Harrison St  |Chicago|IL   |60612|http://home.chicagopolice.org/community/districts/11th-district-harrison/      |312-746-8386|312-746-4281|312-746-5151|1155244.069 |1897148.755 |41.87358229|-87.70548813|(41.8735822883, -87.705488126) |011            |
|16          |Jefferson Park|5151 N Milwaukee Ave|Chicago|IL   |60630|http://home.chicagopolice.org/community/districts/16th-district-jefferson-park/|312-742-4480|312-742-4421|312-742-4423|1138480.758 |1933660.473 |41.97409445|-87.76614884|(41.9740944511, -87.7661488432)|016            |
+------------+--------------+--------------------+-------+-----+-----+-------------------------------------------------------------------------------+------------+------------+------------+------------+------------+-----------+------------+-------------------------------+---------------+
only showing top 5 rows

In [71]:
rc.join(ps, rc['District'] == ps["Format District"], "left_outer").show()
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+--------+--------------+--------------------+-------+-----+-----+--------------------+------------+------------+------------+------------+------------+-----------+------------+--------------------+---------------+
|      ID|Case Number|               Date|               Block|IUCR|        Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|          Updated On|Latitude|Longitude|Location|DISTRICT| DISTRICT NAME|             ADDRESS|   CITY|STATE|  ZIP|             WEBSITE|       PHONE|         FAX|         TTY|X COORDINATE|Y COORDINATE|   LATITUDE|   LONGITUDE|            LOCATION|Format District|
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+--------+--------------+--------------------+-------+-----+-----+--------------------+------------+------------+------------+------------+------------+-----------+------------+--------------------+---------------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|        null|        null|2001|08/05/2017 03:50:...|    null|     null|    null|       4| South Chicago|     2255 E 103rd St|Chicago|   IL|60617|http://home.chica...|312-747-7581|312-747-5276|312-747-9169| 1193131.299| 1837090.265|41.70793329|-87.56834912|(41.7079332906, -...|            004|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281| CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|      22|   Morgan Park| 1900 W Monterey Ave|Chicago|   IL|60643|http://home.chica...|312-745-0710|312-745-0814|312-745-0569| 1165825.476| 1830851.333|41.69143478|-87.66852039|(41.6914347795, -...|            022|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|            BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       8|  Chicago Lawn|      3420 W 63rd St|Chicago|   IL|60629|http://home.chica...|312-747-8730|312-747-8545|312-747-8116| 1154575.242| 1862672.049|41.77898719|-87.70886382|(41.778987189, -8...|            008|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|               THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       3|Grand Crossing|7040 S Cottage Gr...|Chicago|   IL|60637|http://home.chica...|312-747-8201|312-747-5479|312-747-9168| 1182739.183| 1858317.732|41.76643089|-87.60574786|(41.7664308925, -...|            003|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281| CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       1|       Central|     1718 S State St|Chicago|   IL|60616|http://home.chica...|312-745-4290|312-745-3694|312-745-3693| 1176569.052| 1891771.704|41.85837259|-87.62735617|(41.8583725929, -...|            001|
|11227517|   JB138481|2013-02-10 00:00:00|071XX S LAFAYETTE...|0266| CRIM SEXUAL ASSAULT|           PREDATORY|           RESIDENCE| false|   false|0731|     007|   6|            69|      02|        null|        null|2013|02/11/2018 03:57:...|    null|     null|    null|       7|     Englewood|      1438 W 63rd St|Chicago|   IL|60636|http://home.chica...|312-747-8223|312-747-6558|312-747-6652| 1167659.235| 1863005.522|41.77963154|-87.66088702|(41.7796315359, -...|            007|
|11227503|   JB146383|2015-01-01 00:01:00|061XX S KILBOURN AVE|1751|OFFENSE INVOLVING...|CRIM SEX ABUSE BY...|           RESIDENCE| false|    true|0813|     008|  13|            65|      17|        null|        null|2015|04/12/2019 04:00:...|    null|     null|    null|       8|  Chicago Lawn|      3420 W 63rd St|Chicago|   IL|60629|http://home.chica...|312-747-8730|312-747-8545|312-747-8116| 1154575.242| 1862672.049|41.77898719|-87.70886382|(41.778987189, -8...|            008|
|11227508|   JB146365|2017-01-01 00:01:00|  027XX S WHIPPLE ST|1754|OFFENSE INVOLVING...|AGG SEX ASSLT OF ...|           RESIDENCE| false|   false|1033|     010|  12|            30|      02|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|      10|         Ogden|    3315 W Ogden Ave|Chicago|   IL|60623|http://home.chica...|312-747-7511|312-747-7429|312-747-7471| 1154500.753| 1890985.501|41.85668453|-87.70838196|(41.8566845327, -...|            010|
|11022695|   JA353568|2017-07-17 10:10:00| 021XX W MC LEAN AVE|0810|               THEFT|           OVER $500|           RESIDENCE| false|   false|1432|     014|  32|            22|      06|        null|        null|2017|07/24/2017 03:54:...|    null|     null|    null|      14|   Shakespeare|2150 N California...|Chicago|   IL|60647|http://home.chica...|312-744-8250|312-744-2422|312-744-8260| 1157304.426| 1914481.521|41.92110332|-87.69745182|(41.9211033246, -...|            014|
|11227633|   JB147500|2017-12-28 15:55:00|011XX S MICHIGAN AVE|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|                null| false|   false|0123|     001|   2|            32|      11|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       1|       Central|     1718 S State St|Chicago|   IL|60616|http://home.chica...|312-745-4290|312-745-3694|312-745-3693| 1176569.052| 1891771.704|41.85837259|-87.62735617|(41.8583725929, -...|            001|
|11227586|   JB147613|2017-02-10 12:00:00|089XX S COTTAGE G...|1310|     CRIMINAL DAMAGE|         TO PROPERTY|           APARTMENT| false|   false|0633|     006|   8|            44|      14|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       6|       Gresham|   7808 S Halsted St|Chicago|   IL|60620|http://home.chica...|312-745-3617|312-745-3649|312-745-3639| 1172283.013| 1853022.646|41.75213684|-87.64422891|(41.7521368378, -...|            006|
|11227475|   JB147314|2017-11-22 02:42:00|056XX N CHRISTIAN...|2826|       OTHER OFFENSE|HARASSMENT BY ELE...|           APARTMENT| false|    true|1711|     017|  39|            13|      26|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|      17|   Albany Park|   4650 N Pulaski Rd|Chicago|   IL|60630|http://home.chica...|312-742-4410|312-742-5411|312-742-5451|  1148843.91| 1930801.058|41.96605342|-87.72811456|(41.9660534171, -...|            017|
|11227247|   JB147078|2012-01-01 09:00:00|105XX S INDIANAPO...|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0432|     004|  10|            52|      11|        null|        null|2012|02/11/2018 03:57:...|    null|     null|    null|       4| South Chicago|     2255 E 103rd St|Chicago|   IL|60617|http://home.chica...|312-747-7581|312-747-5276|312-747-9169| 1193131.299| 1837090.265|41.70793329|-87.56834912|(41.7079332906, -...|            004|
|11036284|   JA370282|2017-07-29 15:40:00|   014XX W Devon Ave|0820|               THEFT|      $500 AND UNDER|            SIDEWALK| false|   false|2432|     024|  40|             1|      06|        null|        null|2017|08/05/2017 03:50:...|    null|     null|    null|      24|   Rogers Park|     6464 N Clark St|Chicago|   IL|60626|http://home.chica...|312-744-5907|312-744-6928|312-744-7603| 1164193.588| 1943199.401|41.99976348|-87.67132429|(41.9997634842, -...|            024|
|11227509|   JB146413|2017-01-22 00:01:00|079XX S JEFFERY BLVD|1752|OFFENSE INVOLVING...|AGG CRIM SEX ABUS...|           APARTMENT| false|   false|0414|     004|   8|            46|      20|        null|        null|2017|02/11/2018 03:57:...|    null|     null|    null|       4| South Chicago|     2255 E 103rd St|Chicago|   IL|60617|http://home.chica...|312-747-7581|312-747-5276|312-747-9169| 1193131.299| 1837090.265|41.70793329|-87.56834912|(41.7079332906, -...|            004|
|11227407|   JB147329|2017-10-14 00:01:00|037XX N SOUTHPORT...|1150|  DECEPTIVE PRACTICE|   CREDIT CARD FRAUD|               OTHER| false|   false|1922|     019|  44|             6|      11|        null|        null|2017|02/22/2018 03:56:...|    null|     null|    null|      19|     Town Hall|    850 W Addison St|Chicago|   IL|60613|http://home.chica...|312-744-8320|312-744-4481|312-744-8011| 1169730.744| 1924160.317|41.94740046|-87.65151202|(41.9474004564, -...|            019|
|11028056|   JA359834|2014-10-15 15:00:00|  047XX S PULASKI RD|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|PARKING LOT/GARAG...| false|   false|0821|     008|  14|            57|      11|        null|        null|2014|07/24/2017 03:54:...|    null|     null|    null|       8|  Chicago Lawn|      3420 W 63rd St|Chicago|   IL|60629|http://home.chica...|312-747-8730|312-747-8545|312-747-8116| 1154575.242| 1862672.049|41.77898719|-87.70886382|(41.778987189, -8...|            008|
|11028299|   JA360073|2015-05-30 00:00:00| 074XX S HARVARD AVE|1753|OFFENSE INVOLVING...|SEX ASSLT OF CHIL...|           RESIDENCE| false|    true|0731|     007|  17|            69|      02|        null|        null|2015|05/15/2018 03:52:...|    null|     null|    null|       7|     Englewood|      1438 W 63rd St|Chicago|   IL|60636|http://home.chica...|312-747-8223|312-747-6558|312-747-6652| 1167659.235| 1863005.522|41.77963154|-87.66088702|(41.7796315359, -...|            007|
|11028290|   JA360134|2015-05-30 00:00:00| 074XX S HARVARD AVE|1753|OFFENSE INVOLVING...|SEX ASSLT OF CHIL...|           RESIDENCE| false|    true|0731|     007|  17|            69|      02|        null|        null|2015|05/22/2018 04:05:...|    null|     null|    null|       7|     Englewood|      1438 W 63rd St|Chicago|   IL|60636|http://home.chica...|312-747-8223|312-747-6558|312-747-6652| 1167659.235| 1863005.522|41.77963154|-87.66088702|(41.7796315359, -...|            007|
|11041422|   JA375398|2017-07-29 10:00:00|022XX W WINNEMAC AVE|0810|               THEFT|           OVER $500|    RESIDENCE-GARAGE| false|   false|2031|     020|  47|             4|      06|        null|        null|2017|08/05/2017 03:50:...|    null|     null|    null|      20|       Lincoln|  5400 N Lincoln Ave|Chicago|   IL|60625|http://home.chica...|312-742-8714|312-742-8803|312-742-8841| 1158399.146| 1935788.826|41.97954951|-87.69284451|(41.9795495131, -...|            020|
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+--------------------+--------+---------+--------+--------+--------------+--------------------+-------+-----+-----+--------------------+------------+------------+------------+------------+------------+-----------+------------+--------------------+---------------+
only showing top 20 rows

In [72]:
ps.columns
Out[72]:
['DISTRICT',
 'DISTRICT NAME',
 'ADDRESS',
 'CITY',
 'STATE',
 'ZIP',
 'WEBSITE',
 'PHONE',
 'FAX',
 'TTY',
 'X COORDINATE',
 'Y COORDINATE',
 'LATITUDE',
 'LONGITUDE',
 'LOCATION',
 'Format District']
In [73]:
rc.join(ps, rc['District'] == ps["Format District"], "left_outer").drop(
 'ADDRESS',
 'CITY',
 'STATE',
 'ZIP',
 'WEBSITE',
 'PHONE',
 'FAX',
 'TTY',
 'X COORDINATE',
 'Y COORDINATE',
 'LATITUDE',
 'LONGITUDE',
 'LOCATION'
).show()
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+----+--------------------+--------+--------------+---------------+
|      ID|Case Number|               Date|               Block|IUCR|        Primary Type|         Description|Location Description|Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|Year|          Updated On|DISTRICT| DISTRICT NAME|Format District|
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+----+--------------------+--------+--------------+---------------+
|11034701|   JA366925|2001-01-01 11:00:00|     016XX E 86TH PL|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0412|     004|   8|            45|      11|2001|08/05/2017 03:50:...|       4| South Chicago|            004|
|11227287|   JB147188|2017-10-08 03:00:00|  092XX S RACINE AVE|0281| CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|           RESIDENCE| false|   false|2222|     022|  21|            73|      02|2017|02/11/2018 03:57:...|      22|   Morgan Park|            022|
|11227583|   JB147595|2017-03-28 14:00:00|     026XX W 79TH ST|0620|            BURGLARY|      UNLAWFUL ENTRY|               OTHER| false|   false|0835|     008|  18|            70|      05|2017|02/11/2018 03:57:...|       8|  Chicago Lawn|            008|
|11227293|   JB147230|2017-09-09 20:17:00|060XX S EBERHART AVE|0810|               THEFT|           OVER $500|           RESIDENCE| false|   false|0313|     003|  20|            42|      06|2017|02/11/2018 03:57:...|       3|Grand Crossing|            003|
|11227634|   JB147599|2017-08-26 10:00:00| 001XX W RANDOLPH ST|0281| CRIM SEXUAL ASSAULT|      NON-AGGRAVATED|         HOTEL/MOTEL| false|   false|0122|     001|  42|            32|      02|2017|02/11/2018 03:57:...|       1|       Central|            001|
|11227517|   JB138481|2013-02-10 00:00:00|071XX S LAFAYETTE...|0266| CRIM SEXUAL ASSAULT|           PREDATORY|           RESIDENCE| false|   false|0731|     007|   6|            69|      02|2013|02/11/2018 03:57:...|       7|     Englewood|            007|
|11227503|   JB146383|2015-01-01 00:01:00|061XX S KILBOURN AVE|1751|OFFENSE INVOLVING...|CRIM SEX ABUSE BY...|           RESIDENCE| false|    true|0813|     008|  13|            65|      17|2015|04/12/2019 04:00:...|       8|  Chicago Lawn|            008|
|11227508|   JB146365|2017-01-01 00:01:00|  027XX S WHIPPLE ST|1754|OFFENSE INVOLVING...|AGG SEX ASSLT OF ...|           RESIDENCE| false|   false|1033|     010|  12|            30|      02|2017|02/11/2018 03:57:...|      10|         Ogden|            010|
|11022695|   JA353568|2017-07-17 10:10:00| 021XX W MC LEAN AVE|0810|               THEFT|           OVER $500|           RESIDENCE| false|   false|1432|     014|  32|            22|      06|2017|07/24/2017 03:54:...|      14|   Shakespeare|            014|
|11227633|   JB147500|2017-12-28 15:55:00|011XX S MICHIGAN AVE|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|                null| false|   false|0123|     001|   2|            32|      11|2017|02/11/2018 03:57:...|       1|       Central|            001|
|11227586|   JB147613|2017-02-10 12:00:00|089XX S COTTAGE G...|1310|     CRIMINAL DAMAGE|         TO PROPERTY|           APARTMENT| false|   false|0633|     006|   8|            44|      14|2017|02/11/2018 03:57:...|       6|       Gresham|            006|
|11227475|   JB147314|2017-11-22 02:42:00|056XX N CHRISTIAN...|2826|       OTHER OFFENSE|HARASSMENT BY ELE...|           APARTMENT| false|    true|1711|     017|  39|            13|      26|2017|02/11/2018 03:57:...|      17|   Albany Park|            017|
|11227247|   JB147078|2012-01-01 09:00:00|105XX S INDIANAPO...|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|           RESIDENCE| false|   false|0432|     004|  10|            52|      11|2012|02/11/2018 03:57:...|       4| South Chicago|            004|
|11036284|   JA370282|2017-07-29 15:40:00|   014XX W Devon Ave|0820|               THEFT|      $500 AND UNDER|            SIDEWALK| false|   false|2432|     024|  40|             1|      06|2017|08/05/2017 03:50:...|      24|   Rogers Park|            024|
|11227509|   JB146413|2017-01-22 00:01:00|079XX S JEFFERY BLVD|1752|OFFENSE INVOLVING...|AGG CRIM SEX ABUS...|           APARTMENT| false|   false|0414|     004|   8|            46|      20|2017|02/11/2018 03:57:...|       4| South Chicago|            004|
|11227407|   JB147329|2017-10-14 00:01:00|037XX N SOUTHPORT...|1150|  DECEPTIVE PRACTICE|   CREDIT CARD FRAUD|               OTHER| false|   false|1922|     019|  44|             6|      11|2017|02/22/2018 03:56:...|      19|     Town Hall|            019|
|11028056|   JA359834|2014-10-15 15:00:00|  047XX S PULASKI RD|1153|  DECEPTIVE PRACTICE|FINANCIAL IDENTIT...|PARKING LOT/GARAG...| false|   false|0821|     008|  14|            57|      11|2014|07/24/2017 03:54:...|       8|  Chicago Lawn|            008|
|11028299|   JA360073|2015-05-30 00:00:00| 074XX S HARVARD AVE|1753|OFFENSE INVOLVING...|SEX ASSLT OF CHIL...|           RESIDENCE| false|    true|0731|     007|  17|            69|      02|2015|05/15/2018 03:52:...|       7|     Englewood|            007|
|11028290|   JA360134|2015-05-30 00:00:00| 074XX S HARVARD AVE|1753|OFFENSE INVOLVING...|SEX ASSLT OF CHIL...|           RESIDENCE| false|    true|0731|     007|  17|            69|      02|2015|05/22/2018 04:05:...|       7|     Englewood|            007|
|11041422|   JA375398|2017-07-29 10:00:00|022XX W WINNEMAC AVE|0810|               THEFT|           OVER $500|    RESIDENCE-GARAGE| false|   false|2031|     020|  47|             4|      06|2017|08/05/2017 03:50:...|      20|       Lincoln|            020|
+--------+-----------+-------------------+--------------------+----+--------------------+--------------------+--------------------+------+--------+----+--------+----+--------------+--------+----+--------------------+--------+--------------+---------------+
only showing top 20 rows

Challenge questions

What is the most frequently reported non-criminal activity?

In [74]:
rc.select('Primary Type').distinct().count()
Out[74]:
36
In [75]:
rc.select('Primary Type').distinct().orderBy(col('Primary Type')).show(35, truncate=False)
+---------------------------------+
|Primary Type                     |
+---------------------------------+
|ARSON                            |
|ASSAULT                          |
|BATTERY                          |
|BURGLARY                         |
|CONCEALED CARRY LICENSE VIOLATION|
|CRIM SEXUAL ASSAULT              |
|CRIMINAL DAMAGE                  |
|CRIMINAL SEXUAL ASSAULT          |
|CRIMINAL TRESPASS                |
|DECEPTIVE PRACTICE               |
|DOMESTIC VIOLENCE                |
|GAMBLING                         |
|HOMICIDE                         |
|HUMAN TRAFFICKING                |
|INTERFERENCE WITH PUBLIC OFFICER |
|INTIMIDATION                     |
|KIDNAPPING                       |
|LIQUOR LAW VIOLATION             |
|MOTOR VEHICLE THEFT              |
|NARCOTICS                        |
|NON - CRIMINAL                   |
|NON-CRIMINAL                     |
|NON-CRIMINAL (SUBJECT SPECIFIED) |
|OBSCENITY                        |
|OFFENSE INVOLVING CHILDREN       |
|OTHER NARCOTIC VIOLATION         |
|OTHER OFFENSE                    |
|PROSTITUTION                     |
|PUBLIC INDECENCY                 |
|PUBLIC PEACE VIOLATION           |
|RITUALISM                        |
|ROBBERY                          |
|SEX OFFENSE                      |
|STALKING                         |
|THEFT                            |
+---------------------------------+
only showing top 35 rows

In [76]:
nc = rc.filter( (col('Primary Type') == 'NON - CRIMINAL') | (col('Primary Type') == 'NON-CRIMINAL ') | (col('Primary Type') == 'NON-CRIMINAL (SUBJECT SPECIFIED)') )
nc.show(truncate=False)
+--------+-----------+-------------------+----------------------+----+--------------------------------+--------------------------------------+-------------------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+------------+-------------+-----------------------------+
|ID      |Case Number|Date               |Block                 |IUCR|Primary Type                    |Description                           |Location Description           |Arrest|Domestic|Beat|District|Ward|Community Area|FBI Code|X Coordinate|Y Coordinate|Year|Updated On            |Latitude    |Longitude    |Location                     |
+--------+-----------+-------------------+----------------------+----+--------------------------------+--------------------------------------+-------------------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+------------+-------------+-----------------------------+
|10062441|HY250685   |2015-05-07 13:20:00|012XX S HARDING AVE   |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |1011|010     |24  |29            |26      |1150243     |1894129     |2015|02/10/2018 03:50:01 PM|41.865394646|-87.723928428|(41.865394646, -87.723928428)|
|10064717|HY253344   |2015-05-08 13:15:00|051XX S WENTWORTH AVE |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|false |false   |0225|002     |3   |37            |26      |1175826     |1871120     |2015|02/10/2018 03:50:01 PM|41.80171934 |-87.630703621|(41.80171934, -87.630703621) |
|10072565|HY261001   |2015-05-14 10:30:00|006XX N WELLS ST      |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |STREET                         |false |false   |1832|018     |42  |8             |26      |1174623     |1904537     |2015|02/10/2018 03:50:01 PM|41.89344506 |-87.634117632|(41.89344506, -87.634117632) |
|10109156|HY297801   |2015-06-12 09:00:00|053XX S NEVA AVE      |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |0811|008     |23  |56            |26      |1129584     |1868411     |2015|02/10/2018 03:50:01 PM|41.795197456|-87.800355525|(41.795197456, -87.800355525)|
|10115077|HY304017   |2015-06-16 19:00:00|081XX S WHIPPLE ST    |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |0835|008     |18  |70            |26      |1157460     |1850515     |2015|02/10/2018 03:50:01 PM|41.745568408|-87.698616805|(41.745568408, -87.698616805)|
|10124614|HY313353   |2015-06-23 17:05:00|085XX W WINNEMAC AVE  |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |true  |false   |1614|016     |41  |76            |26      |1118538     |1932386     |2015|02/10/2018 03:50:01 PM|41.970936043|-87.839512637|(41.970936043, -87.839512637)|
|10125981|HY314305   |2015-06-24 15:30:00|021XX N CALIFORNIA AVE|5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|false |false   |1414|014     |35  |22            |26      |1157345     |1914452     |2015|02/10/2018 03:50:01 PM|41.921021491|-87.69730355 |(41.921021491, -87.69730355) |
|10127418|HY315600   |2015-06-25 15:30:00|022XX W 51ST ST       |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |0931|009     |16  |63            |26      |1162194     |1870807     |2015|02/10/2018 03:50:01 PM|41.801155339|-87.68070621 |(41.801155339, -87.68070621) |
|10127785|HY316123   |2015-06-25 22:45:00|051XX N MILWAUKEE AVE |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|true  |false   |1623|016     |45  |11            |26      |1138424     |1933673     |2015|02/10/2018 03:50:01 PM|41.974129858|-87.766357256|(41.974129858, -87.766357256)|
|10128364|HY316525   |2015-06-26 10:45:00|035XX S MICHIGAN AVE  |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|false |false   |0213|002     |3   |35            |26      |1177772     |1881665     |2015|02/10/2018 03:50:01 PM|41.830611847|-87.623247369|(41.830611847, -87.623247369)|
|10181019|HY369010   |2015-08-01 10:15:00|079XX S KEDZIE AVE    |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |0835|008     |18  |70            |26      |1156427     |1851731     |2015|02/10/2018 03:50:01 PM|41.748926157|-87.70236927 |(41.748926157, -87.70236927) |
|10202049|HY389275   |2015-08-19 18:38:00|025XX W MARQUETTE RD  |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |APARTMENT                      |false |false   |0832|008     |15  |66            |26      |1160388     |1860136     |2015|02/10/2018 03:50:01 PM|41.771910102|-87.687623385|(41.771910102, -87.687623385)|
|10221247|HY406742   |2015-09-01 22:00:00|031XX W HARRISON ST   |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|false |false   |1134|011     |24  |27            |26      |1155457     |1897193     |2015|02/10/2018 03:50:01 PM|41.873699424|-87.704705156|(41.873699424, -87.704705156)|
|10233370|HY421530   |2015-09-13 10:45:00|010XX S MENARD AVE    |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |true  |false   |1513|015     |29  |25            |26      |1137869     |1895239     |2015|02/10/2018 03:50:01 PM|41.868672696|-87.769327726|(41.868672696, -87.769327726)|
|10241515|HY429346   |2015-09-19 07:45:00|051XX N MILWAUKEE AVE |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|true  |false   |1623|016     |45  |11            |26      |1138424     |1933673     |2015|02/10/2018 03:50:01 PM|41.974129858|-87.766357256|(41.974129858, -87.766357256)|
|10280097|HY468448   |2015-10-19 18:50:00|033XX W OGDEN AVE     |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |POLICE FACILITY/VEH PARKING LOT|false |false   |1024|010     |24  |29            |26      |1154489     |1891024     |2015|02/10/2018 03:50:01 PM|41.856790413|-87.708424071|(41.856790413, -87.708424071)|
|10300617|HY489191   |2015-11-03 15:00:00|031XX S HALSTED ST    |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |RESIDENCE                      |false |false   |0913|009     |11  |60            |26      |1171479     |1884120     |2015|02/10/2018 03:50:01 PM|41.837489008|-87.646264459|(41.837489008, -87.646264459)|
|10344075|HY535016   |2015-12-12 20:50:00|025XX W 80TH PL       |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |VEHICLE NON-COMMERCIAL         |false |false   |0835|008     |18  |70            |26      |1160683     |1851174     |2015|02/10/2018 03:50:01 PM|41.747310961|-87.68678891 |(41.747310961, -87.68678891) |
|10371674|HZ107512   |2016-01-07 17:36:00|051XX S WENTWORTH AVE |5073|NON-CRIMINAL (SUBJECT SPECIFIED)|NOTIFICATION OF CIVIL NO CONTACT ORDER|JAIL / LOCK-UP FACILITY        |false |true    |0225|002     |3   |37            |26      |1175826     |1871120     |2016|02/10/2018 03:50:01 PM|41.80171934 |-87.630703621|(41.80171934, -87.630703621) |
|10397129|HZ133234   |2016-01-29 15:30:00|006XX W HARRISON ST   |5114|NON - CRIMINAL                  |FOID - REVOCATION                     |STREET                         |false |false   |0124|001     |2   |28            |26      |1172257     |1897564     |2016|02/10/2018 03:50:01 PM|41.874363279|-87.643013039|(41.874363279, -87.643013039)|
+--------+-----------+-------------------+----------------------+----+--------------------------------+--------------------------------------+-------------------------------+------+--------+----+--------+----+--------------+--------+------------+------------+----+----------------------+------------+-------------+-----------------------------+
only showing top 20 rows

In [77]:
nc.groupBy(col('Description')).count().orderBy('count', ascending=False).show(truncate=False)
+--------------------------------------+-----+
|Description                           |count|
+--------------------------------------+-----+
|FOID - REVOCATION                     |38   |
|NOTIFICATION OF CIVIL NO CONTACT ORDER|9    |
+--------------------------------------+-----+

Using a bar chart, plot which day of the week has the most number of reported crime.

In [78]:
from pyspark.sql.functions import dayofweek
In [79]:
help(dayofweek)
Help on function dayofweek in module pyspark.sql.functions:

dayofweek(col)
    Extract the day of the week of a given date as integer.
    
    >>> df = spark.createDataFrame([('2015-04-08',)], ['dt'])
    >>> df.select(dayofweek('dt').alias('day')).collect()
    [Row(day=4)]
    
    .. versionadded:: 2.3

In [80]:
rc.select(col('Date'), dayofweek(col('Date'))).show(5)
+-------------------+---------------+
|               Date|dayofweek(Date)|
+-------------------+---------------+
|2001-01-01 11:00:00|              2|
|2017-10-08 03:00:00|              1|
|2017-03-28 14:00:00|              3|
|2017-09-09 20:17:00|              7|
|2017-08-26 10:00:00|              7|
+-------------------+---------------+
only showing top 5 rows

In [81]:
from pyspark.sql.functions import date_format
In [82]:
help(date_format)
Help on function date_format in module pyspark.sql.functions:

date_format(date, format)
    Converts a date/timestamp/string to a value of string in the format specified by the date
    format given by the second argument.
    
    A pattern could be for instance `dd.MM.yyyy` and could return a string like '18.03.1993'. All
    pattern letters of the Java class `java.text.SimpleDateFormat` can be used.
    
    .. note:: Use when ever possible specialized functions like `year`. These benefit from a
        specialized implementation.
    
    >>> df = spark.createDataFrame([('2015-04-08',)], ['dt'])
    >>> df.select(date_format('dt', 'MM/dd/yyy').alias('date')).collect()
    [Row(date='04/08/2015')]
    
    .. versionadded:: 1.5

In [83]:
rc.select(col('Date'), dayofweek(col('Date')), date_format(col('Date'), 'E')).orderBy("dayofweek(Date)").show(5)
+-------------------+---------------+--------------------+
|               Date|dayofweek(Date)|date_format(Date, E)|
+-------------------+---------------+--------------------+
|2012-01-01 09:00:00|              1|                 Sun|
|2017-10-01 00:00:00|              1|                 Sun|
|2017-01-22 00:01:00|              1|                 Sun|
|2017-10-08 03:00:00|              1|                 Sun|
|2017-01-01 00:01:00|              1|                 Sun|
+-------------------+---------------+--------------------+
only showing top 5 rows

In [84]:
from pyspark.sql.functions import count, avg
In [85]:
ss = rc.groupBy(dayofweek(col('Date')), date_format(col('Date'), 'E')).agg(count("*")).show()
+---------------+--------------------+--------+
|dayofweek(Date)|date_format(Date, E)|count(1)|
+---------------+--------------------+--------+
|              2|                 Mon|  952646|
|              6|                 Fri| 1016882|
|              1|                 Sun|  911174|
|              5|                 Thu|  964457|
|              4|                 Wed|  973801|
|              3|                 Tue|  967965|
|              7|                 Sat|  965095|
+---------------+--------------------+--------+

In [86]:
ss = rc.groupBy(dayofweek(col('Date')), date_format(col('Date'), 'E')).count().orderBy('dayofweek(Date)')
In [87]:
ss.show()
+---------------+--------------------+-------+
|dayofweek(Date)|date_format(Date, E)|  count|
+---------------+--------------------+-------+
|              1|                 Sun| 911174|
|              2|                 Mon| 952646|
|              3|                 Tue| 967965|
|              4|                 Wed| 973801|
|              5|                 Thu| 964457|
|              6|                 Fri|1016882|
|              7|                 Sat| 965095|
+---------------+--------------------+-------+

In [88]:
type(ss)
Out[88]:
pyspark.sql.dataframe.DataFrame
In [89]:
sbar = ss.withColumn("Day of Week", col("date_format(Date, E)"))
In [90]:
import plotly.express as px
fig = px.bar(sbar.toPandas(), x="Day of Week", y="count")
fig.show()
In [91]:
import importlib.util
spec = importlib.util.spec_from_file_location("plotly", "/Users/tallamjr/github/forks/plotly.py/packages/python/plotly/plotly/io/_html.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.to_html(fig, include_plotlyjs=False, full_html=False)
Out[91]:
'<div>                                        <div id="7dc7e1f5-3923-4a6d-ba62-91cd9ad9579d" class="plotly-graph-div"                     style="height:100%; width:100%;">                </div>                <script type="text/javascript">                    window.PLOTLYENV=window.PLOTLYENV || {};                if (document.getElementById("7dc7e1f5-3923-4a6d-ba62-91cd9ad9579d")) {                    Plotly.newPlot(                        "7dc7e1f5-3923-4a6d-ba62-91cd9ad9579d",                        [{"alignmentgroup": "True", "hovertemplate": "Day of Week=%{x}<br>count=%{y}<extra></extra>", "legendgroup": "", "marker": {"color": "#636efa"}, "name": "", "offsetgroup": "", "orientation": "v", "showlegend": false, "textposition": "auto", "type": "bar", "x": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "xaxis": "x", "y": [911174, 952646, 967965, 973801, 964457, 1016882, 965095], "yaxis": "y"}],                        {"barmode": "relative", "legend": {"tracegroupgap": 0}, "margin": {"t": 60}, "template": {"data": {"bar": [{"error_x": {"color": "#2a3f5f"}, "error_y": {"color": "#2a3f5f"}, "marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "bar"}], "barpolar": [{"marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "barpolar"}], "carpet": [{"aaxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "baxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "type": "carpet"}], "choropleth": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "choropleth"}], "contour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "contour"}], "contourcarpet": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "contourcarpet"}], "heatmap": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmap"}], "heatmapgl": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmapgl"}], "histogram": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "histogram"}], "histogram2d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2d"}], "histogram2dcontour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2dcontour"}], "mesh3d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "mesh3d"}], "parcoords": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "parcoords"}], "pie": [{"automargin": true, "type": "pie"}], "scatter": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter"}], "scatter3d": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter3d"}], "scattercarpet": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattercarpet"}], "scattergeo": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergeo"}], "scattergl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergl"}], "scattermapbox": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermapbox"}], "scatterpolar": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolar"}], "scatterpolargl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolargl"}], "scatterternary": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterternary"}], "surface": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "surface"}], "table": [{"cells": {"fill": {"color": "#EBF0F8"}, "line": {"color": "white"}}, "header": {"fill": {"color": "#C8D4E3"}, "line": {"color": "white"}}, "type": "table"}]}, "layout": {"annotationdefaults": {"arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1}, "coloraxis": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "colorscale": {"diverging": [[0, "#8e0152"], [0.1, "#c51b7d"], [0.2, "#de77ae"], [0.3, "#f1b6da"], [0.4, "#fde0ef"], [0.5, "#f7f7f7"], [0.6, "#e6f5d0"], [0.7, "#b8e186"], [0.8, "#7fbc41"], [0.9, "#4d9221"], [1, "#276419"]], "sequential": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "sequentialminus": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]]}, "colorway": ["#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52"], "font": {"color": "#2a3f5f"}, "geo": {"bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white"}, "hoverlabel": {"align": "left"}, "hovermode": "closest", "mapbox": {"style": "light"}, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": {"angularaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "radialaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "scene": {"xaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "yaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "zaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}}, "shapedefaults": {"line": {"color": "#2a3f5f"}}, "ternary": {"aaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "baxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "caxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "title": {"x": 0.05}, "xaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}, "yaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}}}, "xaxis": {"anchor": "y", "domain": [0.0, 1.0], "title": {"text": "Day of Week"}}, "yaxis": {"anchor": "x", "domain": [0.0, 1.0], "title": {"text": "count"}}},                        {"responsive": true}                    )                };                </script>        </div>'
In [92]:
dow = [ x[0] for x in rc.groupBy(date_format(col('Date'), 'E')).count().collect() ]
dow
Out[92]:
['Sun', 'Mon', 'Thu', 'Sat', 'Wed', 'Tue', 'Fri']
In [93]:
cnt = [ x[1] for x in rc.groupBy(date_format(col('Date'), 'E')).count().collect() ]
cnt
Out[93]:
[911174, 952646, 964457, 965095, 973801, 967965, 1016882]
In [94]:
import pandas as pd
In [95]:
data = {'Day of Week': dow, 'Count': cnt}
data
Out[95]:
{'Count': [911174, 952646, 964457, 965095, 973801, 967965, 1016882],
 'Day of Week': ['Sun', 'Mon', 'Thu', 'Sat', 'Wed', 'Tue', 'Fri']}
In [96]:
pdf = pd.DataFrame(data)
In [97]:
sdf = spark.createDataFrame(pdf)
sdf.show()
+-----------+-------+
|Day of Week|  Count|
+-----------+-------+
|        Sun| 911174|
|        Mon| 952646|
|        Thu| 964457|
|        Sat| 965095|
|        Wed| 973801|
|        Tue| 967965|
|        Fri|1016882|
+-----------+-------+

/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/session.py:714: UserWarning:

createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.enabled' is set to true; however, failed by the reason below:
  An error occurred while calling z:org.apache.spark.sql.api.python.PythonSQLUtils.readArrowStreamFromFile.
: java.lang.IllegalArgumentException
	at java.nio.ByteBuffer.allocate(ByteBuffer.java:334)
	at org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$$anon$3.readNextBatch(ArrowConverters.scala:243)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$$anon$3.<init>(ArrowConverters.scala:229)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$.getBatchesFromStream(ArrowConverters.scala:228)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:216)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:214)
	at org.apache.spark.util.Utils$.tryWithResource(Utils.scala:2543)
	at org.apache.spark.sql.execution.arrow.ArrowConverters$.readArrowStreamFromFile(ArrowConverters.scala:214)
	at org.apache.spark.sql.api.python.PythonSQLUtils$.readArrowStreamFromFile(PythonSQLUtils.scala:46)
	at org.apache.spark.sql.api.python.PythonSQLUtils.readArrowStreamFromFile(PythonSQLUtils.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
	at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
	at py4j.Gateway.invoke(Gateway.java:282)
	at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
	at py4j.commands.CallCommand.execute(CallCommand.java:79)
	at py4j.GatewayConnection.run(GatewayConnection.java:238)
	at java.lang.Thread.run(Thread.java:748)

Attempting non-optimization as 'spark.sql.execution.arrow.fallback.enabled' is set to true.

In [98]:
pdf
Out[98]:
Day of Week Count
0 Sun 911174
1 Mon 952646
2 Thu 964457
3 Sat 965095
4 Wed 973801
5 Tue 967965
6 Fri 1016882
In [99]:
import matplotlib.pyplot as plt
%matplotlib inline
In [100]:
pdf.sort_values('Count', ascending=False).plot(kind='bar', color='blue', x='Day of Week', y='Count')
plt.xlabel('Day of Week')
plt.ylabel('Number of reported crimes')
plt.title('Number of reported crimes for each of the week')
Out[100]:
Text(0.5,1,'Number of reported crimes for each of the week')
In [101]:
dwnum = rc.select(col('Date'), \
             dayofweek(col('Date')), \
             date_format(col('Date'), 'E')) \
        .groupBy(dayofweek(col('Date'))).count().orderBy("dayofweek(Date)").show()
+---------------+-------+
|dayofweek(Date)|  count|
+---------------+-------+
|              1| 911174|
|              2| 952646|
|              3| 967965|
|              4| 973801|
|              5| 964457|
|              6|1016882|
|              7| 965095|
+---------------+-------+

In [102]:
help(dayofweek)
Help on function dayofweek in module pyspark.sql.functions:

dayofweek(col)
    Extract the day of the week of a given date as integer.
    
    >>> df = spark.createDataFrame([('2015-04-08',)], ['dt'])
    >>> df.select(dayofweek('dt').alias('day')).collect()
    [Row(day=4)]
    
    .. versionadded:: 2.3

In [103]:
rc.groupBy(date_format(col('Date'), 'E')).count().collect()
Out[103]:
[Row(date_format(Date, E)='Sun', count=911174),
 Row(date_format(Date, E)='Mon', count=952646),
 Row(date_format(Date, E)='Thu', count=964457),
 Row(date_format(Date, E)='Sat', count=965095),
 Row(date_format(Date, E)='Wed', count=973801),
 Row(date_format(Date, E)='Tue', count=967965),
 Row(date_format(Date, E)='Fri', count=1016882)]

Maps

In [104]:
ps.select("Latitude", 'Longitude').show(5)
+-----------+------------+
|   Latitude|   Longitude|
+-----------+------------+
|41.83070169|-87.62339535|
|41.85837259|-87.62735617|
|41.75213684|-87.64422891|
|41.87358229|-87.70548813|
|41.97409445|-87.76614884|
+-----------+------------+
only showing top 5 rows

In [105]:
latlong = ps.groupBy("Latitude", "Longitude").count().show(23)
+-----------+------------+-----+
|   Latitude|   Longitude|count|
+-----------+------------+-----+
|41.85668453|-87.70838196|    1|
|41.77963154|-87.66088702|    1|
|41.99976348|-87.67132429|    1|
|41.83739443|-87.64640771|    1|
|41.96605342|-87.72811456|    1|
|41.97409445|-87.76614884|    1|
|       null|        null|    2|
|41.88008346|-87.76819989|    1|
|41.97954951|-87.69284451|    1|
|41.69143478|-87.66852039|    1|
|41.77898719|-87.70886382|    1|
|41.76643089|-87.60574786|    1|
|41.80181109|-87.63056018|    1|
|41.92110332|-87.69745182|    1|
|41.70793329|-87.56834912|    1|
|41.90324165|-87.64335214|    1|
|41.94740046|-87.65151202|    1|
|41.85837259|-87.62735617|    1|
|41.69272336|-87.60450587|    1|
|41.87358229|-87.70548813|    1|
|41.83070169|-87.62339535|    1|
|41.75213684|-87.64422891|    1|
|41.91860889|-87.76557448|    1|
+-----------+------------+-----+

In [106]:
latlongrc = rc.groupBy("Latitude", "Longitude").count().orderBy('count', ascending=False)

latlongrc.show()
+------------+-------------+-----+
|    Latitude|    Longitude|count|
+------------+-------------+-----+
|        null|         null|65476|
|41.976290414|-87.905227221|13113|
|41.754592961|-87.741528537| 9432|
|41.883500187|-87.627876698| 6933|
|41.897895128|-87.624096605| 4287|
|41.896888586|-87.628203192| 3120|
|41.909664252|-87.742728815| 3037|
|41.885487535|-87.726422045| 2680|
|41.904192368|-87.647000785| 2545|
|41.788987036| -87.74147999| 2455|
| 41.88233367|-87.627841791| 2438|
|41.721627204|-87.624485177| 2380|
|41.736259984|-87.628068782| 2370|
|41.737094305|-87.572998178| 2284|
| 41.68995741|-87.637460623| 2257|
|41.739265865|-87.604893749| 2187|
|41.891990384|-87.611461502| 2179|
|41.868180939|-87.709271389| 2169|
|41.979006297|-87.906463155| 2137|
|41.736148121|-87.629070243| 2050|
+------------+-------------+-----+
only showing top 20 rows

In [107]:
latlongrc = latlongrc.where(col("Latitude").isNotNull())

latlongrc.show()
+------------+-------------+-----+
|    Latitude|    Longitude|count|
+------------+-------------+-----+
|41.976290414|-87.905227221|13113|
|41.754592961|-87.741528537| 9432|
|41.883500187|-87.627876698| 6933|
|41.897895128|-87.624096605| 4287|
|41.896888586|-87.628203192| 3120|
|41.909664252|-87.742728815| 3037|
|41.885487535|-87.726422045| 2680|
|41.904192368|-87.647000785| 2545|
|41.788987036| -87.74147999| 2455|
| 41.88233367|-87.627841791| 2438|
|41.721627204|-87.624485177| 2380|
|41.736259984|-87.628068782| 2370|
|41.737094305|-87.572998178| 2284|
| 41.68995741|-87.637460623| 2257|
|41.739265865|-87.604893749| 2187|
|41.891990384|-87.611461502| 2179|
|41.868180939|-87.709271389| 2169|
|41.979006297|-87.906463155| 2137|
|41.736148121|-87.629070243| 2050|
|41.706070186|-87.653645803| 2004|
+------------+-------------+-----+
only showing top 20 rows

In [108]:
# import plotly.express as px
# fig = px.density_mapbox(latlongrc.toPandas(), lat='Latitude', lon='Longitude', z='count', radius=10,
#                         center=dict(lat=0, lon=180), zoom=0,
#                         mapbox_style="stamen-terrain")
# fig.show()
In [109]:
latlongrc.count()
Out[109]:
860250
In [110]:
latlongrcSample = latlongrc.limit(100)

latlongrcSample.show()
+------------+-------------+-----+
|    Latitude|    Longitude|count|
+------------+-------------+-----+
|41.976290414|-87.905227221|13113|
|41.754592961|-87.741528537| 9432|
|41.883500187|-87.627876698| 6933|
|41.897895128|-87.624096605| 4287|
|41.896888586|-87.628203192| 3120|
|41.909664252|-87.742728815| 3037|
|41.885487535|-87.726422045| 2680|
|41.904192368|-87.647000785| 2545|
|41.788987036| -87.74147999| 2455|
| 41.88233367|-87.627841791| 2438|
|41.721627204|-87.624485177| 2380|
|41.736259984|-87.628068782| 2370|
|41.737094305|-87.572998178| 2284|
| 41.68995741|-87.637460623| 2257|
|41.739265865|-87.604893749| 2187|
|41.891990384|-87.611461502| 2179|
|41.868180939|-87.709271389| 2169|
|41.979006297|-87.906463155| 2137|
|41.736148121|-87.629070243| 2050|
|41.706070186|-87.653645803| 2004|
+------------+-------------+-----+
only showing top 20 rows

In [111]:
latlongrcSample.count()
Out[111]:
100
In [112]:
latlongrcSample.printSchema()
root
 |-- Latitude: string (nullable = true)
 |-- Longitude: string (nullable = true)
 |-- count: long (nullable = false)

In [113]:
from pyspark.sql.types import *
In [114]:
latlongrcSampleCast = latlongrcSample.withColumn("Longitude", latlongrcSample["Longitude"].cast(DoubleType()))
In [115]:
latlongrcSampleCast = latlongrcSampleCast.withColumn("Latitude", latlongrcSample["Latitude"].cast(DoubleType()))
In [116]:
latlongrcSampleCast.printSchema()
root
 |-- Latitude: double (nullable = true)
 |-- Longitude: double (nullable = true)
 |-- count: long (nullable = false)

In [117]:
latlongrcSampleCast.show(2)
+------------+-------------+-----+
|    Latitude|    Longitude|count|
+------------+-------------+-----+
|41.976290414|-87.905227221|13113|
|41.754592961|-87.741528537| 9432|
+------------+-------------+-----+
only showing top 2 rows

In [118]:
import plotly.express as px

fig = px.scatter_mapbox(latlongrcSampleCast.toPandas(), lat="Latitude", lon="Longitude", hover_name="count", hover_data=["count"],
                        color_discrete_sequence=["fuchsia"], zoom=10, height=600)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
In [119]:
import importlib.util
spec = importlib.util.spec_from_file_location("plotly", "/Users/tallamjr/github/forks/plotly.py/packages/python/plotly/plotly/io/_html.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.to_html(fig, include_plotlyjs=False, full_html=False)
Out[119]:
'<div>                                        <div id="3e14a227-cdf8-49fd-998a-14f5a8c209ce" class="plotly-graph-div"                     style="height:600px; width:100%;">                </div>                <script type="text/javascript">                    window.PLOTLYENV=window.PLOTLYENV || {};                if (document.getElementById("3e14a227-cdf8-49fd-998a-14f5a8c209ce")) {                    Plotly.newPlot(                        "3e14a227-cdf8-49fd-998a-14f5a8c209ce",                        [{"customdata": [[13113], [9432], [6933], [4287], [3120], [3037], [2680], [2545], [2455], [2438], [2380], [2370], [2284], [2257], [2187], [2179], [2169], [2137], [2050], [2004], [1957], [1915], [1896], [1891], [1887], [1878], [1862], [1854], [1850], [1848], [1838], [1832], [1829], [1790], [1695], [1678], [1670], [1655], [1655], [1601], [1591], [1587], [1586], [1586], [1585], [1583], [1560], [1559], [1548], [1537], [1535], [1527], [1523], [1523], [1518], [1511], [1480], [1433], [1429], [1427], [1416], [1416], [1412], [1391], [1374], [1370], [1362], [1353], [1351], [1348], [1346], [1331], [1323], [1308], [1296], [1288], [1286], [1285], [1278], [1272], [1260], [1251], [1248], [1245], [1238], [1234], [1233], [1226], [1210], [1196], [1185], [1182], [1179], [1177], [1176], [1173], [1173], [1170], [1166], [1165]], "hovertemplate": "<b>%{hovertext}</b><br><br>count=%{customdata[0]}<br>Latitude=%{lat}<br>Longitude=%{lon}<extra></extra>", "hovertext": [13113.0, 9432.0, 6933.0, 4287.0, 3120.0, 3037.0, 2680.0, 2545.0, 2455.0, 2438.0, 2380.0, 2370.0, 2284.0, 2257.0, 2187.0, 2179.0, 2169.0, 2137.0, 2050.0, 2004.0, 1957.0, 1915.0, 1896.0, 1891.0, 1887.0, 1878.0, 1862.0, 1854.0, 1850.0, 1848.0, 1838.0, 1832.0, 1829.0, 1790.0, 1695.0, 1678.0, 1670.0, 1655.0, 1655.0, 1601.0, 1591.0, 1587.0, 1586.0, 1586.0, 1585.0, 1583.0, 1560.0, 1559.0, 1548.0, 1537.0, 1535.0, 1527.0, 1523.0, 1523.0, 1518.0, 1511.0, 1480.0, 1433.0, 1429.0, 1427.0, 1416.0, 1416.0, 1412.0, 1391.0, 1374.0, 1370.0, 1362.0, 1353.0, 1351.0, 1348.0, 1346.0, 1331.0, 1323.0, 1308.0, 1296.0, 1288.0, 1286.0, 1285.0, 1278.0, 1272.0, 1260.0, 1251.0, 1248.0, 1245.0, 1238.0, 1234.0, 1233.0, 1226.0, 1210.0, 1196.0, 1185.0, 1182.0, 1179.0, 1177.0, 1176.0, 1173.0, 1173.0, 1170.0, 1166.0, 1165.0], "lat": [41.976290414, 41.754592961, 41.883500187, 41.897895128, 41.896888586, 41.909664252, 41.885487535, 41.904192368, 41.788987036, 41.88233367, 41.721627204, 41.736259984, 41.737094305, 41.68995741, 41.739265865, 41.891990384, 41.868180939, 41.979006297, 41.736148121, 41.706070186, 41.814007401, 42.019399237, 41.868541914, 41.750940757, 41.899410159, 41.766102387, 41.976200173, 41.874363279, 41.929743818, 41.78210152, 41.864493678, 41.876607964, 41.882394062, 41.907153315, 41.908430535, 41.795991039, 41.866810739, 41.88171846, 41.836385231, 41.918711651, 41.903775756, 41.777309867, 41.891694878, 41.707519433, 41.769185486, 41.692833841, 41.73365047, 41.866331725, 41.750832464, 41.878370307, 41.873699424, 41.852216317, 41.742710224, 41.692041778, 41.844112707, 41.71902307, 41.892753031, 41.953436358, 41.946542477, 41.881883933, 41.888165132, 41.902437713, 41.880224549, 41.883210775, 41.839816207, 41.829879483, 41.850330711, 41.749460005, 41.866389063, 41.877585867, 41.867608211, 41.803201891, 41.832329279, 41.884856209, 41.878931004, 41.705677782, 41.93991842, 41.849045571, 41.862011728, 41.735857166, 41.991262667, 41.807650669, 41.850424032, 41.86821682, 41.904370109, 41.688218178, 41.866843668, 41.754168689, 41.96137851, 41.878638996, 41.781954133, 41.976762981, 41.781374962, 41.923672617, 41.880751096, 41.850517353, 41.871025414, 41.757614433, 41.829651528, 41.868165405], "legendgroup": "", "lon": [-87.905227221, -87.741528537, -87.627876698, -87.624096605, -87.628203192, -87.742728815, -87.726422045, -87.647000785, -87.74147999, -87.627841791, -87.624485177, -87.628068782, -87.572998178, -87.637460623, -87.604893749, -87.611461502, -87.709271389, -87.906463155, -87.629070243, -87.653645803, -87.628331665, -87.675049485, -87.639235361, -87.625185222, -87.624131266, -87.573539169, -87.905312411, -87.643013039, -87.684273777, -87.586502002, -87.639158, -87.627644063, -87.627844798, -87.639680572, -87.638509526, -87.630542489, -87.625817031, -87.627760426, -87.66571041, -87.76551063, -87.639324074, -87.640802922, -87.626155832, -87.601839023, -87.625732415, -87.60431945, -87.557845321, -87.666379171, -87.605224746, -87.707248137, -87.704705156, -87.627075368, -87.634088181, -87.665923635, -87.628445336, -87.620528559, -87.624193896, -87.746273229, -87.736084376, -87.640060441, -87.622937212, -87.687011559, -87.688248952, -87.629906972, -87.617516172, -87.612291851, -87.627026373, -87.72089612, -87.707276938, -87.683123746, -87.680298775, -87.72198373, -87.616983146, -87.763346345, -87.639585621, -87.600944364, -87.653288878, -87.708829783, -87.69378445, -87.624152861, -87.660305558, -87.643080489, -87.627029017, -87.6304532, -87.631460067, -87.537357913, -87.625816668, -87.601635756, -87.65474101, -87.627691486, -87.683713146, -87.900983721, -87.617209584, -87.786301606, -87.723855981, -87.627031661, -87.699510379, -87.586115266, -87.614451899, -87.62743954], "marker": {"color": "fuchsia"}, "mode": "markers", "name": "", "showlegend": false, "subplot": "mapbox", "type": "scattermapbox"}],                        {"height": 600, "legend": {"tracegroupgap": 0}, "mapbox": {"center": {"lat": 41.843944627229995, "lon": -87.65970842684999}, "domain": {"x": [0.0, 1.0], "y": [0.0, 1.0]}, "style": "open-street-map", "zoom": 10}, "margin": {"b": 0, "l": 0, "r": 0, "t": 0}, "template": {"data": {"bar": [{"error_x": {"color": "#2a3f5f"}, "error_y": {"color": "#2a3f5f"}, "marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "bar"}], "barpolar": [{"marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "barpolar"}], "carpet": [{"aaxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "baxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "type": "carpet"}], "choropleth": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "choropleth"}], "contour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "contour"}], "contourcarpet": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "contourcarpet"}], "heatmap": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmap"}], "heatmapgl": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmapgl"}], "histogram": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "histogram"}], "histogram2d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2d"}], "histogram2dcontour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2dcontour"}], "mesh3d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "mesh3d"}], "parcoords": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "parcoords"}], "pie": [{"automargin": true, "type": "pie"}], "scatter": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter"}], "scatter3d": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter3d"}], "scattercarpet": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattercarpet"}], "scattergeo": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergeo"}], "scattergl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergl"}], "scattermapbox": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermapbox"}], "scatterpolar": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolar"}], "scatterpolargl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolargl"}], "scatterternary": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterternary"}], "surface": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "surface"}], "table": [{"cells": {"fill": {"color": "#EBF0F8"}, "line": {"color": "white"}}, "header": {"fill": {"color": "#C8D4E3"}, "line": {"color": "white"}}, "type": "table"}]}, "layout": {"annotationdefaults": {"arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1}, "coloraxis": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "colorscale": {"diverging": [[0, "#8e0152"], [0.1, "#c51b7d"], [0.2, "#de77ae"], [0.3, "#f1b6da"], [0.4, "#fde0ef"], [0.5, "#f7f7f7"], [0.6, "#e6f5d0"], [0.7, "#b8e186"], [0.8, "#7fbc41"], [0.9, "#4d9221"], [1, "#276419"]], "sequential": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "sequentialminus": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]]}, "colorway": ["#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52"], "font": {"color": "#2a3f5f"}, "geo": {"bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white"}, "hoverlabel": {"align": "left"}, "hovermode": "closest", "mapbox": {"style": "light"}, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": {"angularaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "radialaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "scene": {"xaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "yaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "zaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}}, "shapedefaults": {"line": {"color": "#2a3f5f"}}, "ternary": {"aaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "baxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "caxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "title": {"x": 0.05}, "xaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}, "yaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}}}},                        {"responsive": true}                    )                };                </script>        </div>'
In [120]:
import plotly.express as px

fig = px.scatter_mapbox(latlongrcSampleCast.toPandas(), lat="Latitude", lon="Longitude", size="count", color="count",
                        color_continuous_scale=px.colors.cyclical.IceFire, zoom=9.5, height=600)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

Run for all points...this crashes my machine each time. Let's try for 100, 000 points now instead.

In [121]:
latlongrc = latlongrc.limit(5000)
In [122]:
latlongrcCast = latlongrc.withColumn("Latitude", latlongrc["Latitude"].cast(DoubleType()))
In [123]:
latlongrcCast = latlongrcCast.withColumn("Longitude", latlongrcCast["Longitude"].cast(DoubleType()))
In [124]:
latlongrcCast.printSchema()
root
 |-- Latitude: double (nullable = true)
 |-- Longitude: double (nullable = true)
 |-- count: long (nullable = false)

In [125]:
import plotly.express as px

fig = px.scatter_mapbox(latlongrcCast.toPandas(), lat="Latitude", lon="Longitude", size="count", color="count",
                        color_continuous_scale=px.colors.cyclical.IceFire, zoom=9.5, height=600)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
In [126]:
import importlib.util
spec = importlib.util.spec_from_file_location("plotly", "/Users/tallamjr/github/forks/plotly.py/packages/python/plotly/plotly/io/_html.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.to_html(fig, include_plotlyjs=False, full_html=False)
Out[126]:
'<div>                                        <div id="06c554dd-2f15-4112-ae1a-0faf90dbc96b" class="plotly-graph-div"                     style="height:600px; width:100%;">                </div>                <script type="text/javascript">                    window.PLOTLYENV=window.PLOTLYENV || {};                if (document.getElementById("06c554dd-2f15-4112-ae1a-0faf90dbc96b")) {                    Plotly.newPlot(                        "06c554dd-2f15-4112-ae1a-0faf90dbc96b",                        [{"hovertemplate": "count=%{marker.color}<br>Latitude=%{lat}<br>Longitude=%{lon}<extra></extra>", "lat": [41.976290414, 41.754592961, 41.883500187, 41.897895128, 41.896888586, 41.909664252, 41.885487535, 41.904192368, 41.788987036, 41.88233367, 41.721627204, 41.736259984, 41.737094305, 41.68995741, 41.739265865, 41.891990384, 41.868180939, 41.979006297, 41.736148121, 41.706070186, 41.814007401, 42.019399237, 41.868541914, 41.750940757, 41.899410159, 41.766102387, 41.976200173, 41.874363279, 41.929743818, 41.78210152, 41.864493678, 41.876607964, 41.882394062, 41.907153315, 41.908430535, 41.795991039, 41.866810739, 41.88171846, 41.836385231, 41.918711651, 41.903775756, 41.777309867, 41.891694878, 41.707519433, 41.769185486, 41.692833841, 41.73365047, 41.866331725, 41.750832464, 41.878370307, 41.873699424, 41.852216317, 41.742710224, 41.692041778, 41.844112707, 41.71902307, 41.892753031, 41.953436358, 41.946542477, 41.881883933, 41.888165132, 41.902437713, 41.880224549, 41.883210775, 41.839816207, 41.829879483, 41.850330711, 41.749460005, 41.866389063, 41.877585867, 41.867608211, 41.803201891, 41.832329279, 41.884856209, 41.878931004, 41.705677782, 41.93991842, 41.849045571, 41.862011728, 41.735857166, 41.991262667, 41.807650669, 41.850424032, 41.86821682, 41.904370109, 41.688218178, 41.866843668, 41.754168689, 41.96137851, 41.878638996, 41.781954133, 41.976762981, 41.781374962, 41.923672617, 41.880751096, 41.850517353, 41.871025414, 41.757614433, 41.829651528, 41.868165405, 41.910835515, 41.751928332, 41.828220982, 41.76680404, 41.909614875, 41.928001461, 41.828762287, 41.885740288, 41.855190551, 41.882539542, 41.791220341, 41.895877613, 41.978991238, 41.706987456, 41.98287878, 41.764682386, 41.780946398, 41.865100146, 41.884650262, 41.964744922, 41.893990113, 41.989243623, 41.830697249, 41.975099794, 41.823798151, 41.80171934, 41.894272651, 41.769925563, 41.880399914, 41.736269116, 41.877514327, 41.772972076, 41.885888079, 41.909307068, 41.881949766, 41.746140855, 41.918646522, 41.788492935, 41.895140898, 41.897837503, 41.881348623, 41.803667488, 41.892017399, 41.754658085, 41.800464977, 41.809305232, 41.903726336, 41.750782715, 41.794533814, 41.818585099, 41.904493689, 41.749899475, 41.96938944, 41.79054357, 41.765997125, 41.844023772, 41.89652481, 41.872709056, 41.903684856, 41.935428738, 41.882470918, 41.880775433, 41.868219921, 41.965393249, 41.865132942, 41.895896023, 41.930946496, 41.779012821, 41.765755571, 41.880362084, 41.976851852, 41.903113054, 41.953900467, 41.80169033, 41.939898633, 41.877565688, 41.966053999, 41.830954079, 41.775429728, 41.867251542, 41.830890037, 41.987362912, 41.775129883, 41.707756212, 41.900489748, 41.87178962, 41.74621174, 41.881088655, 41.895003278, 41.876581037, 41.722578383, 41.899540054, 41.780110888, 41.910764867, 41.852868298, 41.953443342, 41.867428687, 41.7799566, 41.850657231, 41.851958307, 41.897982937, 41.786291714, 41.864197247, 41.758214815, 41.77268594, 41.881183664, 41.73625535, 41.896010965, 41.883167009, 41.947225886, 41.880186421, 41.931582515, 41.898767916, 41.885393253, 41.909636288, 41.755633717, 41.852934738, 41.772998982, 41.873907046, 41.97008868, 41.770020864, 41.80462016, 41.878222138, 41.768096835, 41.846801978, 41.954881682, 41.721180629, 41.866235446, 41.96538061, 41.930049492, 41.76587359, 41.889561428, 41.728226861, 41.737750767, 41.860911204, 41.973167821, 41.778099133, 41.779276522, 41.862218265, 41.708029389, 41.946724511, 41.757630995, 41.768382919, 41.829868313, 41.840859176, 41.882259032, 41.86625461, 41.692358646, 41.884807342, 41.779975054, 41.844162699, 41.89804054, 41.764646721, 41.885481891, 41.936335635, 41.887966168, 41.915729613, 41.85014407, 41.764748911, 41.780328363, 41.911151209, 41.735752519, 41.779059693, 41.833139425, 42.019383301, 41.896664035, 41.750185415, 41.874381838, 41.858594819, 41.866341527, 41.903700111, 41.963070794, 41.93859561, 41.946212132, 41.75089655, 41.729618252, 41.781353265, 41.899065363, 41.85102174, 41.810729022, 41.828695766, 41.79329893, 41.779295906, 41.864217865, 41.841350479, 41.890051565, 41.848549403, 41.841855999, 41.893541578, 41.872963554, 41.947252263, 41.735931109, 41.852051628, 41.651431329, 41.890396818, 41.926287021, 41.829875745, 41.76015578, 41.684809877, 41.877864969, 41.782606243, 41.853930752, 41.804847176, 41.939905846, 41.903077492, 41.844000177, 41.795191528, 41.756057234, 41.801538809, 41.802132606, 41.878630716, 41.754691074, 41.778868505, 41.758122033, 41.892628411, 41.793935909, 41.808500903, 41.765253769, 41.856790413, 41.96491786, 41.945238279, 41.861559271, 41.736126864, 41.79639731, 41.889741913, 41.884790951, 41.889453169, 41.820921514, 41.692569761, 41.778047465, 41.758536614, 41.935432921, 41.906276004, 41.828201751, 41.926404101, 41.809669669, 41.695982095, 41.796216157, 41.809297059, 41.863196881, 41.785519673, 41.767448959, 41.894945606, 41.9764212, 41.765444001, 41.682334926, 41.923976215, 41.808634077, 41.751427982, 41.774945985, 41.809860998, 41.896685066, 41.969078381, 41.778877155, 41.885741029, 41.880586939, 41.902961643, 41.884930978, 41.974861952, 41.906132875, 41.891465732, 41.736422269, 41.904466173, 41.919520368, 41.788699253, 41.927998524, 41.994758989, 41.939444419, 41.750772111, 41.873761627, 41.777967289, 41.713753878, 41.686316773, 41.891404732, 41.903662214, 41.851804072, 41.73327429, 41.874974798, 41.692378887, 41.829389915, 41.786499587, 41.882076985, 41.871371147, 42.018498254, 41.876650547, 41.778767526, 41.746259974, 41.911367051, 41.933582379, 41.823125769, 41.834042232, 41.921021491, 41.785161229, 41.880660786, 41.707095328, 41.75702248, 41.915187259, 41.812610526, 41.884994578, 41.886668404, 41.896714548, 41.873807522, 41.726219145, 41.843922218, 41.810740003, 41.819027613, 41.881944424, 41.885901992, 41.7128602, 41.84809924, 41.763305308, 41.780155491, 41.869786389, 41.808833439, 41.65736912, 41.946648722, 41.925394137, 41.78701723, 41.862118973, 41.831014114, 41.912149595, 41.809125265, 41.916043916, 41.750111323, 41.880717301, 41.946221444, 41.922450893, 41.835947057, 41.773109884, 41.900505589, 42.022062685, 41.881441785, 41.721194359, 41.780595495, 41.851949553, 41.90316534, 41.776150283, 41.883475491, 41.943552694, 41.876889551, 41.909509901, 41.793579386, 41.769070498, 41.81691816, 41.809347098, 41.762161498, 41.779073436, 41.88104652, 41.722362598, 41.946542649, 41.750657714, 41.876059649, 41.8744151, 41.852198325, 41.695908161, 41.812244589, 41.90971226, 41.751270583, 41.951886129, 41.970281428, 41.808147803, 41.804628656, 41.878840427, 41.875232942, 41.731430954, 41.793521775, 41.879235852, 41.900155706, 41.793938009, 41.756302295, 41.903478069, 41.706875037, 41.80779181, 41.771736514, 41.8926701, 41.980826277, 41.966409353, 41.743503863, 41.92046017, 41.77279778, 41.895675136, 41.886815464, 41.82386008, 41.921715143, 41.750538141, 41.779520772, 41.824933076, 41.888131743, 41.885879253, 41.78690669, 42.002478396, 41.799808989, 41.768727829, 41.736277427, 41.911590736, 41.693421344, 41.751464464, 41.88465094, 41.895420644, 41.678519693, 41.777558327, 41.74899896, 41.864693143, 41.945863902, 41.828343176, 41.909804314, 41.865397377, 41.897885763, 41.888676095, 41.677830552, 41.876227971, 41.929028876, 41.984109031, 41.851393305, 41.764632089, 41.883659738, 41.801181128, 41.887919288, 41.886146944, 41.990615196, 41.837871585, 41.778883826, 41.97551745, 41.948131367, 41.873709176, 41.89765683, 41.854963672, 41.900757926, 41.873635421, 41.905684874, 41.736922044, 41.817570192, 41.814162811, 41.909573262, 41.891791478, 41.977017622, 41.878123916, 41.807067906, 41.781576603, 41.766161865, 41.935428755, 41.880108035, 41.762419957, 41.884013483, 41.830611847, 41.736207589, 41.751214876, 41.783522021, 41.893179585, 41.866229446, 41.880238942, 41.86640116, 41.848398456, 41.872274452, 41.80215809, 41.893285756, 41.943108594, 41.879202837, 41.877822179, 41.810676762, 41.909798633, 41.783757424, 41.722768379, 41.879876814, 41.982161273, 41.724927226, 42.007919177, 41.917656022, 41.809687513, 41.794670403, 41.906507267, 41.866202226, 41.876884977, 41.893676531, 41.840565492, 41.756321504, 41.807101267, 41.893646656, 41.875272573, 41.887216061, 41.881847601, 41.931120002, 41.928235818, 41.877565108, 41.680955235, 41.844026941, 41.882457198, 41.965320149, 41.751827103, 41.756259091, 41.849220554, 41.839410287, 41.92510186, 41.779120086, 41.733226633, 41.769661943, 41.965911528, 41.784040514, 41.749880266, 41.861553084, 41.925398449, 41.890037052, 41.866996231, 41.791160785, 41.874077392, 41.894563504, 41.773908018, 41.764728045, 41.778340981, 41.800863342, 41.774495045, 41.885312381, 41.761484638, 41.891678767, 41.783432002, 41.867101385, 41.940412833, 41.765162688, 41.901422057, 41.881203182, 41.896943556, 41.925076902, 41.765988783, 41.880367915, 41.94219754, 41.758607126, 41.897524786, 41.854864309, 41.890384236, 41.896543094, 41.780835284, 41.830530933, 41.801358629, 41.751528912, 41.823665846, 41.893469034, 41.882389156, 41.704885986, 41.884476226, 41.751151039, 41.925098106, 41.764151886, 41.73516861, 41.88946287, 41.923637978, 41.875163991, 41.804133114, 41.891199446, 41.88352126, 41.893281677, 41.7678792, 41.875367424, 41.793876041, 41.900017769, 41.883582151, 41.691314623, 41.885753285, 41.810693516, 41.696187007, 41.750005014, 41.929494816, 41.871811902, 41.894860447, 41.910676312, 41.909240284, 41.909152038, 41.690701233, 41.780243493, 41.830109681, 41.878458449, 41.808586084, 41.749876545, 41.751457646, 41.866235211, 41.803365964, 41.749982305, 41.769378793, 41.884546689, 41.808659359, 41.903125898, 41.879079395, 41.834690813, 41.877788135, 41.736264617, 41.886755667, 41.884389103, 41.892605313, 41.891023035, 41.80036463, 41.801355133, 41.883191631, 41.918511914, 41.727872617, 41.88107271, 41.816792881, 41.851366951, 41.880575249, 41.770525914, 41.774069965, 41.802641458, 41.88065283, 41.867414944, 41.968788631, 41.794462581, 41.880366516, 41.756772166, 41.867081407, 41.89200307, 41.881524451, 41.93467909, 41.882139587, 41.823320055, 41.756714109, 41.777740745, 41.89499875, 41.732214483, 41.95347181, 41.808747436, 41.751270452, 41.999533347, 41.776322631, 42.002225812, 41.899552895, 41.841289747, 41.885369466, 41.761396234, 41.944953005, 41.887216076, 41.965387049, 41.885503844, 41.963008684, 41.866937617, 41.706461203, 41.910494911, 41.886530554, 41.685332125, 41.965781301, 41.88705768, 42.009294803, 41.775519362, 41.903509764, 41.880427066, 41.969326227, 41.940318272, 41.888092864, 41.911864905, 41.754823635, 41.939918899, 41.893962515, 41.756496183, 41.954607083, 41.786735319, 41.906438061, 41.794344947, 41.89486351, 41.960046783, 41.751317167, 41.767245969, 41.920434991, 41.80859321, 41.721303358, 41.909616287, 41.841103444, 41.764708006, 41.873765737, 41.87900312, 41.777838294, 41.816598679, 41.744647338, 41.965457044, 41.76559446, 41.873760261, 41.747851897, 41.75033427, 41.861335178, 41.852731587, 41.911343842, 41.834650079, 41.965426344, 41.802896506, 41.878556485, 41.966653193, 41.844542724, 41.985999837, 41.779872827, 41.910914175, 41.949239279, 41.801692642, 41.881756669, 41.8020092, 41.891133566, 41.876108306, 41.691413679, 41.95529191, 41.76916785, 41.750828226, 41.901073698, 41.816039143, 41.77587085, 41.79826919, 41.884335468, 41.750843608, 41.949283608, 41.90351448, 42.018311737, 41.886275336, 42.001822361, 41.83805499, 41.863375231, 41.880489945, 41.804656783, 41.878726928, 41.909498816, 41.766655655, 41.879000971, 41.751704315, 41.829611625, 41.777635185, 41.888993854, 41.836069707, 41.904394115, 41.886169843, 41.828690018, 41.721439376, 41.820248497, 41.884521087, 41.841622651, 41.779798546, 41.897819723, 41.906765676, 41.874060099, 41.750212035, 41.793065099, 41.886843497, 41.903996883, 41.74403284, 41.783209684, 41.777577536, 41.880801792, 41.823879885, 41.756604794, 41.755929033, 41.874947338, 41.871530533, 41.87813609, 41.873219626, 41.893223483, 41.759012808, 41.895505083, 41.776018543, 41.797218365, 41.769014078, 41.886303497, 41.862365191, 41.763027016, 41.751613643, 41.755554244, 41.775834643, 41.900768924, 41.808201741, 41.880401861, 41.814308166, 41.727096769, 41.751452878, 41.879150456, 41.759402215, 41.841471897, 41.918578314, 41.763625742, 41.878260207, 41.880263631, 41.746229065, 41.912437783, 41.94670237, 41.795190552, 41.810707298, 41.829864596, 41.988630807, 41.863276227, 41.879633871, 41.977370604, 41.883219258, 41.976454319, 41.947763579, 41.799911401, 41.896472326, 41.750490827, 41.791380199, 41.744449336, 41.9116839, 41.756623356, 41.862871696, 41.823536688, 41.855524939, 41.90352381, 41.88068906, 41.877578503, 41.765332603, 41.844074267, 41.910302064, 41.903894777, 41.716517432, 41.938636968, 41.777783073, 41.653330429, 41.790752055, 41.946159169, 41.952901742, 41.782423623, 41.761218589, 41.851988885, 41.88249622, 41.952897791, 41.788786066, 41.879148115, 41.892505345, 41.756550472, 41.722013357, 41.751305337, 41.885741529, 41.742271198, 41.809670667, 41.884333364, 41.894692183, 41.777503445, 41.958902502, 42.018244679, 41.900870422, 41.756094931, 41.886863814, 41.922786529, 41.836600771, 41.878886971, 41.751275763, 41.892667777, 41.881624191, 41.743970443, 41.88096768, 41.975151721, 41.747170897, 41.839804007, 41.894903267, 41.909573038, 41.805322323, 41.803671998, 41.785848109, 41.745394001, 41.785268355, 41.767866727, 41.886039903, 41.782951712, 41.909690217, 41.852901521, 41.9066185, 41.755201817, 41.739860331, 41.974129858, 41.804149939, 41.894961752, 41.895002822, 41.721698686, 41.876671946, 41.890703831, 41.786569368, 41.89773632, 41.968533072, 41.721918366, 41.984622486, 41.827373751, 41.74806235, 41.882381731, 41.735479162, 41.969046206, 41.714597905, 41.886560206, 41.761109412, 41.886190872, 41.882407184, 41.88817016, 41.782655024, 41.780253982, 41.940903244, 41.805470526, 41.756330319, 41.773120341, 41.779153403, 41.928822325, 41.890455604, 41.875155116, 41.830917641, 41.93374417, 41.779112173, 41.816455303, 41.776151397, 41.967189655, 41.79290166, 41.87448398, 41.758571453, 41.902522915, 41.758420277, 41.8032982, 41.831203853, 41.886012928, 41.953885576, 41.797181898, 41.751821289, 41.872924943, 41.895239896, 41.762929162, 41.922450447, 41.968427294, 41.878538751, 41.809220836, 41.745340136, 41.859836913, 41.893650526, 41.83981113, 41.891948167, 41.748957622, 41.740918989, 41.792974653, 41.95386239, 41.736458248, 41.952758475, 41.772016903, 41.881025006, 41.976495786, 41.887123664, 41.892559086, 41.688756095, 41.896343018, 41.754805333, 41.764245207, 41.887154215, 41.780415657, 41.770015517, 41.880910746, 41.890900247, 41.853805427, 41.903836143, 42.019809042, 41.912779231, 41.749657947, 41.677052099, 41.924452852, 41.883208624, 41.895732399, 41.873578134, 41.673548279, 41.925398601, 41.794509508, 41.93743245, 41.906187671, 41.748458232, 41.738884922, 41.830450306, 41.768069819, 41.885191719, 41.816321863, 41.952389116, 41.692233255, 41.88060406, 41.874249283, 41.759780594, 41.889551923, 41.884231489, 41.811382632, 41.80716827, 41.882114362, 41.939300984, 41.930906002, 41.820982288, 42.014216031, 41.81811276, 41.858346536, 41.880773152, 41.778840927, 41.87851302, 41.790240779, 41.768623525, 41.910723622, 41.89039523, 41.757327195, 41.783601519, 41.765843381, 41.735335992, 41.890824988, 41.965961632, 41.853853291, 41.797286045, 41.785187197, 41.888189539, 41.887731576, 41.758125035, 41.88895519, 41.925246375, 41.815933131, 41.870822616, 41.879585026, 41.942257928, 41.721005667, 41.765356327, 41.673554115, 41.780313815, 41.793190357, 41.722385688, 41.880081938, 41.794731271, 41.910239494, 41.891062111, 41.684992237, 41.889096979, 41.759327126, 41.891662431, 41.877402355, 41.823042962, 41.880458148, 41.953643409, 41.796150799, 41.879955866, 41.852882701, 41.767740703, 41.804618366, 41.783451628, 41.895826124, 41.877470199, 41.852419423, 41.768924366, 41.97443857, 41.781184105, 41.798741929, 41.983649153, 41.789931189, 41.85199252, 41.794172544, 41.70600611, 41.89542227, 41.791202978, 41.80062644, 41.854911949, 42.016607113, 41.905447207, 41.775815434, 41.921606937, 41.90416925, 41.966430564, 41.794672085, 41.90690686, 41.831101673, 41.723074622, 41.843879386, 41.778754713, 41.765971524, 41.881893071, 41.773892091, 41.867234401, 41.815418448, 41.748884218, 41.75310285, 41.806890268, 41.771068348, 41.874133594, 41.883376682, 41.963880376, 41.778840516, 41.912585094, 41.866517317, 42.004044032, 41.835686337, 41.87766908, 41.866758579, 41.739004946, 41.766047651, 41.948279589, 41.808052976, 41.781434441, 41.884710837, 41.880486258, 41.717334211, 41.669809286, 41.884497529, 41.97855782, 41.781776304, 41.886179873, 41.695799448, 41.779577735, 41.885028339, 41.707462015, 41.685068588, 41.734547924, 41.855689417, 41.924230143, 41.879383612, 41.680418426, 41.882774244, 41.910624936, 41.778015745, 41.979649551, 41.797936811, 41.880712231, 41.765254159, 41.879097968, 41.808981361, 41.874850606, 41.88090842, 41.748734863, 41.905844192, 41.880487595, 41.880779076, 41.808929094, 41.861081457, 41.778938708, 41.793060906, 41.980639456, 41.780500767, 41.830750796, 41.778625385, 41.870088978, 41.996073378, 41.87543874, 41.940076135, 41.778984586, 41.884229778, 41.903890702, 41.908185345, 41.686460463, 41.779040428, 41.841164277, 41.886288459, 41.670083502, 41.947317986, 41.814317008, 41.828347945, 41.774974401, 41.879297705, 41.908533952, 41.845880198, 41.926261042, 41.736345716, 41.784040653, 41.884483968, 41.943948446, 41.906393604, 41.751375148, 41.784111527, 41.9471781, 41.729126787, 41.715680818, 41.979738594, 41.842709067, 41.778660358, 41.879890416, 41.878227412, 41.73614018, 41.751164599, 41.884484068, 41.991439996, 41.729756954, 41.902085462, 41.972364558, 41.969107389, 41.898333269, 41.807499342, 41.803515121, 41.905833996, 41.896442307, 41.874461408, 41.869201889, 41.801634875, 41.951187878, 41.779806892, 41.887845852, 41.902285227, 41.84097894, 41.735102296, 41.909882217, 41.747393001, 41.896375946, 41.780217525, 41.924491602, 41.810391682, 41.745848924, 41.882864085, 41.706857405, 41.76393165, 41.699184632, 41.942340471, 41.846820192, 41.966728607, 41.973885119, 41.871986073, 41.744544863, 41.782448202, 41.875452995, 41.840672583, 41.764995286, 41.90132405, 41.924902436, 41.875163857, 41.755974849, 41.896083132, 41.758421765, 41.784754925, 41.884486217, 41.765763563, 41.892260249, 41.749315877, 41.789380622, 41.903093846, 41.866644572, 41.7030247, 41.757746672, 41.937919992, 41.816358925, 41.793670175, 41.782432685, 41.943844128, 41.906613775, 41.866496423, 41.792206818, 41.767836987, 41.883326693, 41.953570492, 41.94044477, 41.839464759, 41.937227668, 41.974104832, 41.74719631, 41.736599019, 41.880138214, 41.881556538, 41.969065116, 41.886017951, 41.908849952, 41.939054243, 41.862457487, 41.881994955, 41.985500167, 41.894556302, 41.736377238, 41.874153389, 41.753204151, 41.88108562, 41.866184544, 41.884276844, 41.894848727, 41.69522655, 41.96593721, 41.810815929, 41.870738861, 41.896011332, 41.67736022, 41.89036711, 41.759030974, 41.8865745, 41.86559259, 41.842695834, 41.824675709, 41.88320956, 41.693960671, 41.785950308, 41.893763001, 41.904462488, 41.803391597, 41.880334264, 41.892942019, 41.880425216, 41.88285803, 41.906797102, 41.711714647, 41.790754583, 41.759366666, 41.893652298, 41.735478834, 41.85775341, 41.880509252, 41.973690168, 41.892655438, 41.765039197, 41.880653112, 41.894465726, 41.949649326, 41.692669318, 41.757423116, 41.873789319, 41.843016958, 41.774330555, 41.941748603, 41.892816145, 41.808194805, 41.964235418, 41.884466819, 41.947485405, 41.954535555, 42.001064985, 41.795868205, 41.832337226, 41.823274065, 41.809027523, 42.00711743, 41.972168081, 41.903931582, 41.664294511, 41.877661886, 41.887640628, 41.863375747, 41.893893173, 41.752114055, 41.993892087, 41.866988841, 41.793612114, 41.906507389, 41.899145291, 41.742620493, 41.965720818, 41.773315666, 41.924947914, 41.756091788, 41.766801004, 41.902740661, 41.721734768, 41.793924612, 41.750857878, 41.845267108, 41.774164116, 41.813803157, 41.71557103, 41.827135532, 41.865802306, 41.729154867, 41.843281635, 41.794828373, 41.750936036, 41.894539838, 41.961336068, 41.914055338, 41.837489008, 41.885702079, 41.69189982, 41.673207966, 41.894146429, 41.77999793, 41.742900733, 41.869691442, 41.886817001, 41.753367468, 41.91244802, 41.932012618, 41.773054421, 41.89837293, 41.986107062, 41.885413657, 41.770469009, 41.874119819, 41.771850282, 41.777783389, 41.866215538, 41.764388024, 41.977848233, 41.866604054, 41.880966228, 41.82962557, 41.919863513, 41.93791173, 41.882965153, 41.969762615, 41.773081899, 41.889751946, 41.902243139, 41.976814727, 41.750396912, 41.916375298, 41.762862598, 41.894908283, 41.778661058, 41.896058183, 41.769222543, 41.925284057, 41.891984471, 41.882429735, 41.89920884, 41.877161446, 41.794039603, 41.882477553, 41.894262326, 41.764900898, 41.938797346, 42.014512189, 41.879783007, 41.857533855, 41.876860431, 41.875229772, 41.903933222, 41.899472338, 41.874112944, 41.903354381, 41.79006908, 41.796939201, 41.807062178, 41.853633845, 41.771531518, 41.773320568, 41.945005756, 41.805341531, 41.750775808, 41.949837364, 41.779618399, 41.751300804, 41.765558228, 41.741820708, 41.914691083, 41.801122976, 41.865529454, 41.799204348, 41.737473519, 41.746403307, 41.769417774, 41.881951231, 41.761324418, 41.883208368, 41.751689457, 41.665814864, 41.779013043, 41.970433391, 41.897740622, 41.702403273, 41.911121846, 41.940251326, 41.788681605, 41.878926264, 41.73609565, 41.843892459, 41.932930738, 41.894928829, 41.881988297, 41.721205526, 41.756765393, 41.892507682, 41.768237618, 42.019286795, 41.690567503, 41.885871785, 41.685184204, 41.899667232, 41.902582485, 41.895363905, 41.706204287, 41.823821752, 41.840572746, 41.813770553, 41.922750548, 41.831063762, 41.748943754, 41.700502156, 41.892571811, 41.886136329, 41.876270818, 41.82835964, 41.965943826, 41.722476277, 41.866578077, 41.702696267, 41.893255699, 41.896568854, 41.841825184, 41.884014312, 41.761286569, 41.883578698, 41.830174487, 41.880185454, 41.830871136, 41.773332991, 41.883668321, 41.873510659, 41.771521464, 41.756059048, 41.96245015, 41.945688582, 41.896702263, 41.918431595, 41.91245631, 41.880579428, 41.783434083, 41.779639479, 41.931417509, 41.751268534, 41.927082839, 41.954614809, 41.858568011, 41.808028819, 41.865500587, 41.869145417, 41.868518128, 41.924522422, 41.859492718, 41.778785401, 41.743826264, 41.830443262, 41.734209915, 41.90271022, 41.929644221, 41.829580097, 41.903883485, 41.878056836, 41.898914865, 41.841904764, 41.759042523, 41.756302533, 41.735871734, 41.894945698, 41.949092979, 41.802685798, 41.900192266, 41.882748442, 41.892096977, 41.977609479, 41.949640324, 41.902670403, 41.786079418, 41.901244618, 41.882553868, 41.873733995, 41.998666791, 41.863642218, 41.896403156, 41.76573639, 41.966059402, 41.843473932, 41.775096813, 41.750713304, 41.925160357, 41.877080518, 41.802062624, 41.879241324, 41.784484203, 41.906962748, 41.763647552, 41.893346855, 42.019381225, 41.832571089, 41.90712916, 42.021177601, 41.909800222, 41.692363894, 41.889006322, 41.889202315, 41.959125819, 41.904582292, 41.883175418, 41.902664731, 41.90703235, 41.894898559, 41.899666325, 41.750323974, 41.997544797, 41.762401555, 41.700359791, 41.917346904, 41.721326098, 41.902899152, 41.751717281, 41.793959011, 41.872332627, 41.950736661, 41.794614135, 41.769231153, 41.885384381, 41.760539583, 41.956828595, 41.902370457, 41.745354023, 41.956272914, 41.86566201, 41.707099379, 41.864033702, 41.947769384, 41.856113138, 41.911124622, 41.880553047, 41.874497206, 41.967929496, 41.750794483, 41.854770868, 41.808782124, 41.946076436, 41.899734047, 41.772947511, 41.810453067, 41.88022879, 41.778321993, 41.871556324, 41.910857665, 41.808614751, 41.893179406, 42.021156986, 41.797922443, 41.779800967, 41.784278913, 41.965455324, 41.898516209, 41.761678034, 41.917192515, 41.793436846, 42.021148015, 41.703230009, 41.878864086, 41.903141995, 41.902320502, 41.844580682, 41.884486956, 41.7661636, 41.999679671, 41.831122218, 41.921608313, 41.900039997, 41.877427291, 41.931803039, 41.901845588, 41.974184283, 41.884276366, 41.965665255, 41.855725091, 41.867013845, 41.886393351, 41.876488439, 41.976600326, 41.779413066, 41.774774867, 41.809434463, 41.80156088, 41.786736065, 41.909793282, 41.851761264, 41.90624044, 41.884606524, 41.917317112, 41.924597175, 41.881183104, 41.986460964, 41.858965439, 41.715256909, 41.751476233, 41.753819454, 41.757865688, 41.775144517, 41.883583662, 41.907420613, 41.759793778, 41.868034106, 41.754635641, 41.769414467, 41.986989467, 41.866148185, 41.885729338, 41.887795397, 41.877959571, 41.862117771, 41.818075262, 41.881493402, 41.909384533, 41.80632805, 41.923857611, 41.805343087, 41.774090471, 41.961818424, 41.901873845, 41.94933263, 41.930022549, 41.736146144, 41.779234743, 41.908265588, 41.93990164, 41.762184391, 41.888778301, 41.773313782, 41.754209909, 41.993101615, 41.880349054, 41.985421498, 41.727590123, 41.753602854, 41.880990522, 41.776400433, 41.885368351, 41.962361027, 41.893140033, 41.80133091, 41.887849586, 41.764112658, 41.907056567, 41.874095762, 41.76289941, 41.882880585, 41.765651252, 41.777198547, 41.677661758, 41.79798376, 41.763236237, 41.794511404, 41.968208915, 41.751420646, 42.003611477, 41.755289122, 41.772812361, 41.910723346, 41.804254237, 42.019504078, 41.87328131, 41.779220641, 41.945399848, 41.884924096, 41.801012898, 41.906163332, 41.689402074, 41.752748627, 41.897966193, 41.700134558, 41.722367069, 41.878743645, 41.750397942, 41.837954218, 41.779310448, 41.890013524, 41.873185004, 41.794583892, 41.879494129, 41.890300993, 41.923783122, 41.880452272, 41.698889033, 41.780918241, 41.892649581, 41.903931469, 41.903789944, 41.890975772, 41.770432254, 41.873732481, 41.824177767, 41.959009912, 41.802468489, 41.768788957, 41.749544921, 41.883221363, 41.909746302, 41.886094169, 41.874772171, 41.779960201, 41.905573245, 41.895549905, 41.942199582, 41.862842099, 41.948979271, 41.922655899, 41.874508398, 41.861359279, 41.7685973, 41.757950303, 41.761720809, 41.75119031, 41.963147421, 41.881155761, 41.973263481, 41.802111489, 41.72550966, 41.836466744, 41.889393149, 41.890358524, 41.78161502, 41.823404728, 42.019371503, 41.858832381, 41.92938643, 41.832594585, 41.777221149, 41.894880861, 41.889760548, 41.891893286, 41.873968788, 41.752996613, 41.876166586, 41.758273773, 41.964863437, 41.748074236, 41.766574426, 41.739727015, 41.924224899, 41.910291883, 41.662944028, 41.892631803, 41.880443372, 41.699584978, 41.858643312, 41.794088699, 41.764106016, 42.013109225, 41.869822522, 41.996866019, 41.876795906, 41.859379458, 41.751291477, 41.877369643, 41.932812132, 41.765025476, 41.856920477, 41.758953628, 41.757622369, 41.897730194, 41.875679322, 41.89540929, 41.755797128, 41.917042179, 41.91000536, 41.853203765, 41.888119752, 41.938430626, 41.750154295, 41.990041584, 41.998371665, 41.873855191, 41.707139627, 41.888057631, 41.681357737, 41.884769738, 41.883171361, 41.891198365, 41.738008783, 41.689936366, 41.841683482, 41.901167583, 41.807196856, 41.797490407, 41.909857246, 41.887384761, 41.891243826, 41.899293285, 41.894885819, 41.731670655, 41.754878573, 41.879221392, 41.99827946, 41.781142124, 41.93997806, 41.88111644, 41.926523588, 41.87102983, 41.843795034, 41.968654176, 41.7790899, 41.918570075, 41.875070002, 41.881892729, 41.921751279, 41.779907312, 41.910773194, 41.876396396, 41.886544212, 41.898427551, 41.883211912, 41.844063211, 41.888477259, 41.742267488, 41.885495793, 41.879845704, 41.90915891, 41.939935646, 41.684160442, 41.894884155, 41.821197313, 41.930851845, 41.902940868, 41.851811749, 41.975559264, 41.779806409, 41.737462708, 41.890057206, 41.878567628, 41.967538619, 41.689045293, 41.910121292, 41.883069399, 41.985534487, 41.765965607, 41.880012363, 42.007913834, 41.901133376, 41.721394792, 41.764802087, 41.902678618, 41.908452786, 41.766264384, 41.90393347, 41.949006338, 41.880075611, 41.738978222, 41.955436401, 41.912406937, 41.906899902, 41.781731648, 41.95837913, 41.939566852, 41.748465764, 41.779582501, 41.94955828, 42.020537666, 41.875625633, 41.890954095, 41.736823619, 41.9646299, 41.947802576, 41.905526506, 41.877955172, 41.957333828, 41.974722951, 41.785613571, 41.977043475, 41.792490517, 41.744580809, 41.877454917, 41.880518571, 41.656972482, 41.736930377, 41.852750046, 41.968405527, 41.788940779, 41.980874051, 41.885112119, 41.782279941, 41.897720134, 41.866438916, 41.978495324, 41.809014313, 41.757154442, 41.901680889, 41.964798032, 41.88033698, 41.879505465, 41.875580565, 41.743867618, 41.707250544, 41.984506698, 41.951058037, 41.875508384, 41.8142402, 41.736491541, 41.89413383, 41.961835998, 41.82467357, 41.861747967, 41.947169937, 41.816133545, 41.912799877, 41.866832248, 41.878562742, 41.764728804, 41.884163773, 41.901572414, 41.851761023, 41.953177006, 41.917061131, 41.858413159, 41.866478936, 41.705106592, 41.869047845, 42.019232277, 41.866303171, 41.80099297, 41.809314925, 41.725300675, 41.90214763, 41.910110651, 41.89144754, 41.830701415, 41.972059949, 41.767726292, 41.746010581, 41.909940034, 41.670259794, 41.878115609, 41.792638452, 41.804196865, 41.872894484, 41.99094269, 41.694309334, 41.750880891, 41.890053025, 41.950615509, 41.772532392, 41.909375335, 41.6796504, 41.894824927, 41.766114415, 41.880679165, 41.952866977, 41.905483409, 41.746784577, 41.784563687, 41.98101273, 41.917402098, 41.800620055, 41.727356848, 41.927273891, 41.851912036, 41.721721501, 41.891603117, 41.871489164, 41.88446517, 41.892399066, 41.707203646, 41.829869516, 41.910117898, 41.899925127, 41.90426257, 41.809135012, 41.876730394, 41.977437325, 41.881722193, 41.982270338, 41.922039747, 41.894949856, 41.805126734, 41.991538784, 41.883224344, 42.005849323, 41.770969165, 41.827681913, 41.901976339, 41.90227194, 41.72852756, 41.902023021, 41.884916598, 41.865336883, 41.928076536, 41.97912164, 41.712359904, 41.881770084, 41.873415094, 41.751181266, 41.88058568, 41.699450245, 41.73627756, 41.87046297, 41.901794019, 41.676735364, 41.773536673, 41.968891468, 41.958265994, 41.886370204, 41.76907549, 41.938556557, 41.953972726, 41.842241391, 41.75375771, 41.750869391, 41.941752835, 41.875875253, 41.735380901, 41.968815819, 41.880279804, 41.88489739, 41.878827643, 41.892569818, 41.653083749, 41.840748121, 41.953552346, 41.867476308, 41.88645374, 41.985461281, 41.901822321, 41.780183792, 41.677927829, 41.978108446, 41.865233593, 41.91058325, 41.707455731, 41.923674171, 41.96416436, 41.752019022, 41.757567866, 41.731144695, 41.948068465, 41.876121224, 41.798011899, 41.819192605, 41.938882125, 41.754172384, 41.863861452, 42.00552183, 41.861161041, 41.90938466, 41.728740563, 41.888525948, 41.913376455, 41.881597699, 41.751708436, 42.008612529, 41.851430749, 41.869207622, 41.79771831, 41.777423514, 41.814382204, 41.8280754, 41.893676841, 41.767485391, 41.903935719, 41.987819537, 41.750094836, 41.80066446, 41.760065748, 41.800692217, 41.910872836, 41.751254843, 41.879393185, 41.969044846, 41.862294538, 41.971022998, 41.882209791, 42.007891717, 41.880708104, 41.970864373, 41.886511115, 41.721213371, 41.962032815, 41.768559705, 41.880330431, 41.831990039, 41.837879307, 41.732771785, 41.802137533, 41.902365801, 41.735675715, 41.772907566, 41.986066128, 41.771877151, 41.692122131, 41.878144785, 41.754121535, 41.924102822, 41.897401921, 41.990159786, 41.815924879, 41.892841858, 41.866487235, 41.994815901, 41.702769942, 41.895281809, 41.880470605, 41.91775829, 41.925764201, 41.884470703, 41.981712678, 41.902625518, 41.86641507, 41.810629289, 41.892221309, 41.893946016, 41.736084484, 41.952124569, 41.975606477, 41.653745791, 41.863967977, 41.753123114, 41.84528672, 41.76948433, 41.779176188, 41.885538232, 42.009145091, 41.865024598, 41.903927445, 41.768213543, 41.678237739, 41.694002809, 41.909407737, 41.91739557, 41.933223892, 41.891259443, 41.881978249, 41.953620328, 41.785792907, 41.96823507, 41.890400093, 41.790872026, 41.722040444, 41.812184109, 41.777709298, 41.888267493, 41.981579153, 41.834155131, 41.801868739, 41.933436218, 41.840106225, 41.997808773, 41.756640447, 41.911034084, 41.855869895, 41.881307619, 41.977730236, 41.801307936, 41.692493455, 41.785709457, 41.965249692, 41.775015522, 41.980919411, 41.794437143, 41.808855912, 41.80158649, 41.736625423, 41.779511964, 41.958457273, 41.8804407, 41.790857624, 41.899235024, 41.894916666, 41.953924785, 41.705887536, 41.881088946, 41.893454941, 41.925809934, 41.869353897, 41.764929409, 41.688610361, 41.758716607, 41.997723659, 41.790353984, 41.805421178, 41.902732917, 41.902346538, 41.939943264, 41.751292803, 41.801780906, 41.853622744, 41.753369537, 41.967665781, 41.899293041, 41.858542789, 41.918984872, 41.873855027, 41.884494554, 41.764581624, 41.796234456, 41.76512359, 42.005887804, 41.773085006, 41.755970933, 41.799030006, 41.899970075, 41.869447309, 41.819351842, 41.764349018, 41.872005323, 41.885512978, 41.752151511, 41.894993403, 41.954537863, 41.857279216, 41.890755538, 42.014493615, 41.754331455, 41.884653752, 41.880913833, 41.808682769, 41.972326185, 41.728835841, 41.836559146, 41.722133485, 41.707726164, 41.890051047, 41.752459682, 41.808659638, 41.902614327, 41.909934052, 41.736839959, 41.878156422, 41.759609622, 41.880689561, 41.901993756, 41.945993442, 41.786740885, 41.878244691, 41.902084646, 41.755358678, 41.765286035, 41.798519354, 41.758174759, 42.016030425, 41.784797052, 41.918817288, 41.992919165, 41.880992442, 41.880171918, 41.863567228, 41.786429601, 41.779618833, 41.772901454, 41.777810401, 41.656937576, 41.892509386, 41.751001727, 41.986428158, 41.883765812, 41.870022075, 41.842037919, 41.759381635, 41.842698274, 41.88106593, 41.776622842, 41.772719038, 41.983030629, 41.727129592, 41.736886394, 41.876720197, 41.891579621, 41.778402881, 41.692281606, 41.848105118, 41.875254895, 41.930076795, 41.880632459, 41.778671235, 41.736821826, 41.898882295, 41.881230117, 41.815994603, 41.934809746, 41.881858277, 41.722410409, 41.882363356, 41.903770001, 41.907556016, 41.929822507, 41.880302933, 41.925084098, 41.801888471, 41.954698652, 41.878892807, 41.738503031, 41.966299148, 41.877494027, 41.657321469, 41.917263956, 41.761596782, 41.80888194, 41.707711272, 41.792002104, 41.791821347, 42.007921364, 41.808389342, 41.751767411, 41.89495505, 41.779869327, 41.778864596, 41.779451196, 41.830606764, 41.761727593, 41.990427791, 41.959891679, 41.862497215, 41.895389368, 41.753682356, 41.795830016, 41.914204099, 41.801228804, 41.892824617, 41.882004688, 41.75097171, 41.900743703, 41.924455393, 41.707112161, 41.801141301, 41.793141605, 41.675523891, 41.750229101, 41.964769022, 41.89537651, 41.851007422, 41.914035604, 41.892092606, 41.874288556, 41.822562231, 41.939314951, 41.751719202, 41.882257126, 41.874059075, 41.720783347, 41.880330289, 41.992738481, 41.898926587, 41.829317892, 41.840375885, 41.87911226, 41.707246223, 41.96074753, 41.702313641, 42.011694602, 41.680834251, 41.895457291, 41.9786015, 41.929847446, 41.910800166, 41.758560412, 41.758432859, 41.735406341, 41.794282844, 41.900665603, 41.855870568, 41.956875902, 41.737547633, 41.985516503, 41.751739567, 41.80860717, 41.836126824, 41.872790905, 41.924277399, 41.793766589, 41.828194666, 41.943122315, 41.931639765, 41.907542438, 41.851407157, 41.910049472, 41.794794662, 41.676005238, 41.893179495, 41.867430279, 41.859746945, 41.900546929, 41.729264191, 41.780275775, 42.019372548, 41.87435219, 41.804084538, 41.880991939, 41.706911711, 41.859989233, 41.764707098, 41.958474197, 41.764828675, 41.75048339, 41.988198299, 41.871834768, 41.880972165, 41.816569249, 41.83038838, 41.941592322, 41.894544296, 41.803046687, 41.721568583, 41.794678414, 41.705052523, 41.896729066, 41.830859172, 41.881187452, 41.769044859, 41.745368292, 41.746545819, 41.969330114, 41.78131246, 42.014916096, 41.830712497, 41.962324098, 41.764273074, 41.97043926, 41.65824289, 42.012915394, 41.766246905, 41.953401434, 41.894496091, 41.880555964, 41.751320646, 41.781239632, 41.968529752, 41.93883609, 41.880152185, 41.794530106, 41.889877239, 41.750547026, 41.905932549, 41.845382483, 41.743125083, 41.844252757, 41.882105768, 41.776916526, 41.729171506, 41.752652015, 41.932069855, 41.927889584, 41.875043672, 41.879747044, 41.751305454, 41.821789385, 41.896683405, 41.994567578, 41.923237855, 41.852368074, 41.799462885, 41.965404069, 41.840529595, 41.893983593, 41.758361783, 41.87770039, 41.875328156, 41.802007069, 41.895529663, 41.93203098, 41.757886076, 41.809519024, 41.895327906, 41.983673036, 41.879886887, 41.884466997, 41.941034149, 41.883148997, 41.935409279, 41.899989717, 41.909989881, 41.880446279, 41.925921947, 41.750421805, 41.885204076, 41.772837604, 41.729160106, 41.811443713, 41.807210904, 41.964618881, 41.76460796, 41.766829259, 41.790001609, 41.88791087, 41.880577917, 41.896811683, 41.88100737, 41.744093932, 41.865137529, 41.747184808, 41.876196982, 41.977968974, 41.750706929, 41.798429303, 41.800938808, 41.8762118, 41.789057836, 41.87616378, 41.961158296, 41.769452949, 41.702737032, 41.765698047, 41.88361118, 41.697624892, 41.744731508, 41.706936355, 41.895407139, 41.88030381, 41.756164455, 41.783674009, 41.749873967, 41.686448536, 41.9101204, 41.76740997, 42.007863713, 41.927992712, 41.904662004, 41.858489603, 41.895361374, 41.879667054, 41.910732708, 41.736993626, 42.005832909, 41.90131451, 41.881592273, 41.774330666, 41.896938092, 41.728852906, 41.750403985, 42.009645332, 41.72363784, 41.868780233, 41.894876922, 41.909588772, 41.852159594, 41.900860447, 41.901354465, 41.881679072, 41.785549696, 41.755613227, 41.758737609, 41.885729587, 41.890132638, 41.933177432, 41.730094592, 41.750542059, 41.87870641, 41.792444765, 41.965450685, 41.779249554, 41.924035234, 41.807422809, 41.883527335, 41.766563171, 41.876556349, 41.904810485, 41.756543074, 41.878053886, 41.892607132, 41.99157427, 41.889369287, 41.864519262, 41.917675506, 41.801513039, 41.749015615, 41.933887857, 41.852905207, 41.941821405, 41.899734948, 41.804775828, 41.79443465, 41.764971149, 41.906505009, 41.721895856, 41.877284651, 41.801609105, 41.78495812, 41.721623049, 41.806824289, 41.975664719, 41.799551527, 41.978165506, 41.722242857, 41.778680696, 41.866376012, 41.975862946, 41.947295978, 41.906054951, 41.75752383, 41.893427527, 41.87697656, 41.773405326, 41.741047754, 41.884472382, 41.823822003, 41.902762454, 41.947183891, 41.828533466, 41.89753369, 41.978526568, 41.927312671, 41.779393421, 41.938554681, 41.850656285, 41.895513492, 41.76831036, 41.802064797, 41.860295708, 41.749052851, 41.695942666, 41.890845813, 41.879297767, 41.963599382, 41.902451022, 41.892904362, 41.887338112, 41.74967273, 41.915055232, 41.879045207, 41.858442215, 41.72991452, 41.688666268, 41.758267684, 41.874997972, 41.890081244, 42.017107779, 41.752950248, 41.821553466, 41.876932377, 41.765718456, 41.876933506, 41.924508692, 41.900203265, 41.882934596, 41.832278311, 41.919222845, 41.870724666, 41.751342079, 41.76888502, 41.7675148, 41.876295595, 41.888662662, 41.799240504, 42.015517282, 42.02059812, 41.877882222, 41.879747632, 41.964522471, 41.896045119, 41.894890041, 41.896701788, 41.722421445, 41.880521497, 41.858530159, 41.845169197, 41.883672448, 41.794727026, 41.837650931, 41.90074545, 41.875820724, 41.902297963, 41.767351647, 41.772899106, 41.790571073, 41.881348498, 41.864822916, 41.878895366, 41.779598042, 41.758938155, 41.867584815, 41.880762322, 41.988719229, 41.883691561, 41.88121504, 41.895513392, 41.968010333, 41.72802938, 41.860149538, 41.751100797, 41.721002149, 41.862025293, 41.890013771, 41.87937913, 41.896970377, 41.79903812, 41.879381337, 41.874086805, 42.019463558, 41.756751571, 41.897211487, 41.786729308, 41.994588742, 41.870389849, 41.74634568, 41.968763818, 41.911669895, 36.619446395, 41.76469494, 41.807769669, 41.8744162, 41.764932153, 41.853505832, 41.758579621, 41.803419975, 41.821536978, 41.857567911, 41.739381109, 41.910557078, 41.772556054, 41.96913938, 41.881120698, 41.909085286, 41.925092185, 41.831061814, 41.885447483, 41.698800794, 41.802065071, 41.973336895, 41.877633028, 41.778139616, 41.880404956, 41.881046662, 41.809693341, 41.933780135, 41.93932248, 41.737709752, 41.768167414, 41.895434688, 41.867346388, 41.97583327, 41.727707947, 41.742538716, 41.884571034, 41.692466898, 41.866168484, 41.752174882, 41.861974172, 41.895422368, 41.909920109, 41.871336669, 41.968374092, 41.764686314, 41.877274235, 41.788339891, 41.887812777, 41.779219485, 41.843962091, 41.881730836, 41.738633189, 41.876351148, 41.808856306, 41.819537938, 41.882526427, 41.893261633, 41.769467841, 41.791852481, 41.790614044, 41.746765368, 41.838227796, 41.877111469, 41.772643726, 41.761042853, 41.902829815, 41.923869468, 41.811762307, 41.883734918, 41.850610674, 41.781203314, 41.90498594, 41.869491903, 42.014809612, 41.874367421, 41.809683886, 41.781629386, 41.732730806, 41.902455031, 41.881944411, 41.778731944, 41.88065447, 41.880287347, 41.970599981, 41.915259074, 41.894484934, 41.764885191, 41.692659589, 41.990409975, 41.917671378, 42.017040425, 41.893429499, 41.884512384, 41.86315933, 41.777972797, 41.831003238, 41.874233514, 41.751407191, 41.74215095, 41.986930009, 41.858633393, 41.859809525, 41.844243782, 41.779307977, 41.876265763, 41.965481969, 41.973558433, 41.851327229, 41.910860169, 41.882080827, 41.939507459, 41.993457327, 41.721325872, 41.878962554, 41.706326697, 41.896772914, 41.903805509, 41.894842078, 41.956909436, 41.964351639, 41.870550571, 41.91074006, 41.751266022, 41.930895594, 41.76677448, 41.769916749, 41.909262555, 41.903890971, 41.744614234, 41.906511566, 41.671903369, 41.898371341, 41.880650875, 41.885155992, 41.883541976, 41.8910671, 41.930838072, 41.787807253, 41.912767935, 41.975978414, 41.723360012, 41.873935958, 41.752596188, 41.895445293, 41.794766069, 41.848578193, 41.794424835, 41.735871432, 41.881260233, 42.01980371, 41.783576522, 41.736819983, 41.712456039, 41.851794306, 41.897135527, 41.931800684, 41.754953934, 41.907470043, 41.905033733, 41.883673944, 41.940005868, 41.977225127, 41.957421993, 41.839754776, 41.885326396, 41.88099404, 41.965394976, 41.953852531, 41.987338819, 41.88635374, 41.883330195, 41.72398315, 41.958065808, 41.905529073, 41.871732887, 41.901834826, 41.781238369, 41.785930664, 41.880195761, 41.766274325, 41.928559123, 41.903343349, 41.791350864, 41.902443046, 41.845105566, 41.723048035, 41.700817821, 41.966029543, 41.785898264, 41.885700244, 41.882446221, 41.882142953, 41.84558589, 42.016906591, 41.764569155, 41.77758046, 41.794257212, 41.758868246, 41.941014259, 41.879682085, 41.750472394, 41.690209699, 41.882803164, 41.903933718, 42.020283994, 41.8880146, 41.778871742, 41.813233446, 41.806084616, 41.746945834, 41.720799777, 41.909823499, 41.892527513, 41.775247024, 41.926484632, 41.769447819, 41.707062135, 41.888109048, 41.808969729, 41.693309015, 41.968234567, 41.874400423, 41.829933759, 41.888932488, 41.653425905, 41.900563895, 41.907272203, 41.848851341, 41.758866805, 41.753937269, 41.931657695, 41.747387654, 41.822954703, 41.855749808, 41.827435856, 41.677810006, 41.910470499, 41.925486166, 41.788442006, 41.867069423, 41.885729421, 41.987951293, 41.681988948, 41.866307314, 41.884644137, 41.861130782, 41.764370242, 41.844244706, 41.78238119, 41.691928694, 41.781499104, 41.921907349, 41.899261233, 41.893628633, 41.790716455, 41.802059097, 41.882137696, 41.80890316, 41.877532811, 41.85384608, 41.806999742, 41.894862353, 41.831818944, 41.768498312, 41.830676853, 41.904503346, 41.963653562, 41.837963548, 41.909797796, 41.759011225, 41.777912407, 41.862460407, 41.836428389, 41.764209513, 41.91748779, 41.773509032, 41.745880174, 41.996400617, 41.881854367, 41.836982572, 41.819347317, 41.792226027, 41.707160552, 41.745534625, 41.741304411, 41.750472935, 41.764083357, 41.721691511, 41.938581442, 41.736255058, 41.890032024, 41.997555636, 41.730087889, 41.831881927, 41.859815277, 41.875876362, 41.956118107, 41.878464822, 41.756734991, 41.793424442, 41.916002784, 41.88652124, 41.866199931, 41.879492192, 41.908560535, 42.019398266, 41.967585757, 41.829824529, 41.677410742, 41.772070077, 41.751200475, 41.897694011, 41.774108237, 41.892234447, 41.767910191, 41.76895106, 41.841142759, 41.973797081, 41.910236415, 41.731446259, 41.655411665, 42.005517654, 41.969110786, 41.894171604, 41.754920763, 42.012253586, 41.692576964, 41.755368956, 41.882424852, 41.939301223, 41.92480533, 41.900987979, 41.953552585, 41.884758456, 41.880239322, 41.767720172, 41.904579871, 41.883106296, 41.883209435, 41.931761455, 41.936986127, 41.895993005, 41.802074423, 41.744440245, 41.690383529, 41.887970623, 41.931885873, 41.706378843, 42.006036283, 41.851107212, 41.693320271, 41.905778334, 41.827185501, 41.88314073, 41.911160085, 41.879633598, 41.840717365, 41.960211239, 41.94632941, 41.679413382, 41.899886709, 41.770621253, 41.981051826, 41.780667871, 41.91007391, 41.892328543, 41.907221245, 41.887270825, 41.866519776, 41.902690236, 41.878011115, 41.918633393, 41.897561962, 41.867459843, 41.880935859, 41.889492699, 41.739817594, 41.820777898, 41.736016065, 41.769022335, 41.875290002, 41.772581369, 41.958481128, 41.88728285, 41.902922668, 41.697105657, 41.801875741, 41.736604706, 41.727304299, 41.743553697, 41.772201212, 41.883210106, 41.762719954, 41.692196959, 42.005255827, 41.880781519, 41.894760587, 41.961099303, 41.910962486, 41.876200229, 41.753538951, 41.783891154, 41.887998194, 41.715713748, 41.75310656, 41.714470571, 41.766249991, 41.965282666, 41.750306372, 41.802415236, 41.866303448, 41.778556782, 41.864583447, 41.893200979, 41.79798374, 41.751325905, 41.693022265, 41.94266078, 41.883656549, 41.892694268, 41.872784897, 41.881846294, 41.902141421, 41.807010932, 41.924175435, 41.797572754, 41.690547081, 42.010060309, 41.779503192, 41.770227581, 41.778767609, 41.881734508, 41.9090189, 41.88184935, 41.758979264, 41.924060749, 41.933270602, 41.881948328, 41.790588412, 41.943056436, 41.75021193, 41.81611063, 41.889602962, 41.969143534, 41.894327846, 41.729843669, 41.854956912, 41.809763103, 41.691790031, 41.882764746, 41.742991296, 41.742150773, 41.771117937, 41.876493842, 41.908706263, 41.7690002, 41.92448075, 41.87859028, 41.911609558, 41.931463882, 41.864170798, 41.883057972, 41.881086082, 42.00842557, 41.891412551, 41.949292379, 41.865213688, 41.873330646, 41.866859553, 41.87227988, 41.754937343, 41.752642802, 41.894981059, 41.851684365, 41.885728393, 41.907501113, 41.765316099, 41.816085018, 42.012806272, 41.92590433, 41.789204622, 41.72187776, 41.859912232, 41.764530483, 41.898475258, 41.946021295, 41.771146186, 41.968399337, 41.781322048, 41.872910562, 41.920086604, 41.893623014, 41.903168813, 41.942351064, 41.87760556, 41.891620575, 41.751539633, 41.895774559, 41.912929706, 41.882142354, 41.780267983, 41.894078738, 41.936046155, 41.752935445, 41.878860042, 41.90216959, 42.011717798, 41.920844986, 41.830929961, 41.915886043, 41.878113603, 41.875286899, 41.895692026, 41.777848842, 41.939012917, 41.868447451, 41.912138405, 41.793582028, 41.779704696, 41.759335603, 41.736711088, 41.912602833, 41.856581054, 41.751768, 41.866227191, 41.721938553, 41.866286618, 41.873737423, 41.763484107, 41.931525797, 41.885347387, 41.856958971, 41.79254441, 41.894821547, 41.939588343, 41.781534778, 41.774398607, 41.873192794, 41.907127255, 41.923003976, 41.878584019, 41.758277853, 41.78055534, 41.749445288, 41.812306287, 41.909304522, 41.876196845, 41.939756732, 41.878631263, 41.895729959, 41.887521986, 41.880769306, 41.750432996, 41.931780735, 41.876645737, 41.753092687, 41.938313125, 41.677797185, 41.758459496, 41.852093721, 41.843985432, 41.852192114, 41.97852489, 41.772285481, 41.896133693, 41.940370659, 41.909812904, 41.743902286, 41.845537889, 41.858941291, 41.92527195, 41.730145605, 41.862066283, 41.917217521, 41.713410777, 41.877559057, 41.974678235, 41.877726093, 41.800820216, 41.889906681, 41.886412499, 41.891162264, 41.896956409, 41.75077094, 41.663403306, 41.919898808, 41.832384884, 41.898680349, 41.876498368, 41.954105142, 41.883579906, 41.881703396, 41.809569293, 41.771073064, 41.862830724, 41.975729415, 41.792361522, 41.778436411, 41.873852683, 41.810768138, 41.866993033, 41.877609409, 41.656818764, 41.889629205, 41.893644967, 41.878167778, 41.832102222, 41.927101339, 41.939317702, 41.858514771, 41.780312646, 41.998103671, 41.8665066, 41.756770198, 41.989293402, 41.65364899, 41.939300539, 41.801895518, 41.932738985, 41.890988065, 41.783381141, 41.780439401, 41.895927928, 41.722362932, 41.922486131, 41.899246401, 41.881895543, 41.877018518, 41.851660202, 41.808427535, 41.884600448, 41.880731604, 41.675572338, 41.883218909, 41.963596071, 41.980554579, 41.932629338, 41.92436229, 41.955965816, 41.893349463, 41.750112843, 41.86661375, 41.771362227, 41.735162876, 41.882093928, 41.780352232, 41.791909085, 41.97887761, 41.697086882, 41.783160454, 41.870389764, 41.909436668, 41.887676641, 41.902923197, 41.971100531, 41.891710139, 41.780430614, 41.851961298, 41.788613959, 41.779802622, 41.775378785, 41.717598999, 41.751245333, 41.710315707, 41.854010712, 41.932095135, 41.880237269, 42.012154238, 41.893113371, 41.896564682, 41.931961083, 41.763008906, 41.879410537, 41.759409623, 41.77945628, 41.770980744, 41.750855036, 41.932755165, 41.869527301, 41.980778822, 41.906734077, 41.88093546, 41.779793875, 41.96750702, 41.732821527, 41.692345957, 41.77974142, 41.736345248, 41.875291694, 41.791950089, 41.874180626, 41.89193719, 41.785246261, 41.849069873, 41.879637902, 41.732942865, 41.883283232, 41.891690385, 41.652268611, 41.885778565, 41.892631323, 41.799532089, 41.736272399, 41.909386568, 41.769053315, 41.744075903, 41.909770708, 41.905530484, 41.845577671, 41.780219486, 41.903505509, 41.779960357, 41.812713636, 41.926714681, 41.896370692, 41.762777923, 41.864007298, 41.957462528, 41.982742067, 41.874923802, 41.805679494, 41.878774252, 42.017532073, 41.920472825, 41.87974804, 41.942248935, 41.884534571, 41.865541907, 41.889054749, 41.873119908, 41.994684386, 41.842416891, 41.881787077, 41.963815538, 41.989348532, 41.721689256, 41.968596206, 41.891051707, 41.721590004, 41.761135248, 41.899080522, 41.874225203, 41.877850233, 41.910116718, 41.852351309, 41.659368402, 41.778588585, 41.702282173, 41.893812529, 41.861683877, 41.866098236, 41.92459921, 41.899476558, 41.780569671, 41.880478172, 41.786399399, 41.88360497, 41.832043206, 41.882904715, 41.932222582, 41.685027199, 41.899860332, 41.948602785, 41.914484227, 41.852979389, 41.799404889, 41.865713975, 41.72182671, 41.928458611, 41.783395666, 41.924899029, 41.781099015, 41.886995567, 41.942024436, 41.878334451, 41.788638889, 41.766946791, 41.882931813, 41.696982374, 41.805078225, 41.922332671, 41.938818641, 41.758189864, 41.758085371, 41.894846419, 42.012651582, 41.772701185, 41.766062204, 41.882297385, 41.884640562, 41.778619322, 41.780855651, 41.917980381, 41.755635034, 41.85256088, 41.836808691, 41.864855065, 41.750205507, 41.855574302, 41.917396919, 41.773032424, 42.007356038, 41.936674656, 41.939923405, 41.988008918, 41.767570172, 41.785574176, 41.893481171, 41.785421199, 41.832754487, 41.902217176, 41.854533666, 42.001136868, 41.766247597, 41.91743529, 41.781669308, 41.691359415, 41.910261619, 41.794555987, 41.769696216, 41.787710314, 41.759890565, 41.966012124, 41.768833001, 41.87855848, 41.886524557, 41.735563992, 41.915990756, 41.722385161, 41.79050194, 41.81255052, 41.883271242, 41.860419537, 41.946779572, 41.925174426, 41.886018055, 41.903919035, 41.917161131, 41.877756484, 41.81089989, 41.748526903, 41.744151668, 41.938572513, 41.877014589, 41.772882101, 41.909279917, 41.892745919, 41.795697408, 41.692780068, 41.881191799, 41.902166099, 41.880687244, 41.847867226, 41.768857737, 41.691788999, 41.881132017, 41.863930074, 41.918408656, 41.812412001, 41.925888667, 41.763156062, 41.751492287, 41.69941558, 41.851311967, 41.742254682, 41.882012735, 42.001382198, 41.993388727, 41.856547057, 41.898157514, 41.780462019, 41.85826495, 41.89307048, 41.902703354, 41.778833058, 41.857108058, 41.870364073, 41.916979354, 41.831200469, 41.895391144, 41.764004198, 41.906823047, 41.966490762, 41.766553634, 41.72165754, 41.819556213, 41.862899676, 41.842869772, 41.713353279, 41.880927367, 41.655682504, 41.823556849, 41.930334169, 41.968120549, 41.854649511, 41.783486919, 41.897596067, 41.742761034, 41.733759639, 41.910592416, 41.977181433, 41.79221937, 41.750807192, 41.78954568, 41.676211368, 41.777068318, 41.721763443, 41.864102036, 41.760361887, 41.879437262, 41.779273063, 41.752147383, 41.750224946, 41.876670128, 41.886337253, 41.983373861, 41.764010344, 41.780294584, 41.94319685, 41.803413431, 41.664592914, 41.957873975, 41.812558849, 41.923820753, 41.90002373, 41.773556277, 41.895996468, 41.935701767, 41.823755781, 41.692532002, 41.779671509, 41.886335464, 41.765557778, 41.885080838, 41.959060125, 41.804379051, 41.900519162, 41.974285834, 41.736763314, 41.973339203, 41.93872052, 41.902974842, 41.906372763, 42.01526807, 41.8174293, 41.693107356, 41.657559722, 41.728336543, 41.767847633, 41.991179462, 41.81035919, 41.750523732, 41.771062488, 41.926231713, 41.67754063, 41.783302344, 41.752545308, 41.758970818, 41.881516473, 41.769466772, 41.936778413, 42.003502457, 41.883145003, 41.807646291, 41.927855714, 41.830407799, 41.86866942, 41.759950351, 41.752090412, 41.910214574, 41.880717961, 41.677800201, 41.75049487, 41.743356333, 41.880894745, 41.878229908, 41.932892608, 41.881833712, 41.89608709, 41.882364871, 41.928950523, 41.886493289, 41.910467985, 41.773315928, 41.771431667, 41.768941644, 41.778135022, 41.814563821, 41.751897254, 41.909168175, 41.90982859, 41.904583499, 41.945284535, 41.881693864, 41.831085608, 41.7335097, 41.731581122, 41.883480183, 41.751328369, 41.809294171, 41.801491341, 41.74808565, 41.895316997, 41.874422837, 41.751573305, 41.887136371, 41.748699846, 41.820006933, 41.901487821, 41.895987813, 41.857717887, 41.895548745, 41.803417249, 41.744680815, 42.016035274, 41.952731382, 41.972177117, 41.686039547, 41.921113327, 41.970875157, 41.871706, 41.869349705, 41.930040514, 41.747161712, 41.751165501, 41.773087037, 41.801462544, 41.885389294, 41.893746898, 41.992982985, 41.895822485, 41.758029165, 41.984237719, 41.939270274, 41.768534413, 41.805163581, 41.753790053, 41.872707718, 41.819932337, 41.706768086, 41.883009042, 41.753974914, 41.904685949, 41.833041697, 41.960932247, 41.809578412, 41.750940418, 41.857680243, 41.795197252, 41.874439796, 41.706567182, 41.876587174, 41.922338231, 41.693278898, 41.867191464, 41.780396221, 41.809104714, 41.993673966, 41.832496126, 41.920543756, 41.93030588, 42.021640851, 41.896213602, 42.002282312, 41.795395886, 41.794591289, 42.019450952, 41.863919757, 41.875188816, 41.740247076, 41.75652833, 41.770995109, 41.937725094, 41.876527017, 41.795355464, 41.882764906, 41.945825535, 41.851741044, 41.897761801, 41.880658176, 41.882907496, 41.913157898, 41.792028613, 41.754400648, 41.774319025, 41.705113794, 41.887711996, 41.87799992, 41.908390488, 41.846859523, 41.759355486, 41.847565598, 41.904326846, 41.966047906, 41.773017577, 41.90178302, 41.779235033, 41.894167504, 41.683935959, 41.764978513, 42.0200807, 41.896671452, 41.750510518, 41.83368122, 41.882783992, 41.871867571, 41.983537345, 41.795837911, 41.901170711, 41.751719438, 41.758549218, 41.865434036, 41.777725763, 41.93121391, 41.975334679, 41.853953807, 41.84585638, 41.880129791, 41.991560549, 41.838814549, 41.761915482, 41.885325435, 42.019385566, 41.967618619, 41.898402712, 41.685953051, 41.886832476, 41.782615834, 41.954719937, 41.826069047, 41.865456866, 41.801852528, 41.865946617, 41.882301097, 41.886439939, 41.845345061, 41.7853279, 41.761034113, 41.909826172, 41.947250041, 41.839991916, 41.896702014, 41.852426595, 41.763041071, 41.891946946, 41.879499198, 41.735066205, 41.969504285, 41.886675967, 41.916930759, 41.876959033, 41.870355187, 41.876534902, 41.861863842, 41.877753722, 41.918897061, 41.800881053, 41.758529857, 41.865464821, 41.749027117, 42.010413978, 41.823628586, 41.752812742, 41.898158786, 41.881570868, 41.777651649, 41.864308644, 42.005446228, 41.7505606, 41.881716983, 41.895773204, 41.966393303, 41.897231388, 41.964231677, 41.917407385, 41.909650876, 41.751815845, 41.800849205, 41.995286373, 41.879030298, 41.923141058, 41.882967848, 41.706859194, 41.929925166, 41.977094683, 41.887084037, 41.899250923, 41.890049339, 41.87000817, 41.882295519, 41.755957881, 41.773065672, 41.909618829, 41.808316033, 41.911568497, 41.881650549, 41.686867374, 42.019380398, 41.933796108, 41.931962854, 41.855845871, 41.863690977, 41.771044503, 41.746330371, 41.784056597, 41.749904766, 41.88336939, 41.914741204, 41.988341219, 41.886125885, 41.772625715, 41.866202441, 41.778848012, 41.993558695, 41.880850198, 41.808324708, 41.890206336, 41.747682356, 41.863454049, 41.944862379, 41.882006504, 41.901329063, 41.880988964, 41.7397828, 41.917279172, 41.960049832, 41.905903568, 41.799248277, 41.986181172, 41.940573534, 41.993717892, 41.76533868, 41.953538339, 41.850933613, 41.864137536, 41.875198392, 41.907092509, 41.909407901, 41.656469322, 41.997641144, 41.865072791, 41.75350644, 41.780245963, 41.770199922, 41.79069087, 41.981015746, 41.81600695, 41.806379228, 41.965727545, 42.017499124, 41.896704058, 41.987870213, 41.750682777, 41.765693367, 41.917248372, 41.741950206, 41.967902418, 41.748362873, 41.721773858, 41.891475999, 41.875250729, 41.776757223, 41.902752798, 41.924142132, 41.930380649, 41.925076458, 41.82862242, 41.791750926, 41.924673521, 41.745789092, 41.965917251, 41.867427761, 41.783474441, 41.882184564, 41.86723004, 41.874558082, 41.877184166, 41.874393341, 41.852029531, 41.796087163, 41.881582612, 41.874494994, 41.909058339, 41.903591885, 41.764116191, 41.909577258, 41.870932257, 41.924248208, 41.809317464, 41.781711555, 41.91092608, 41.777931616, 41.838219696, 41.858941802, 41.874728422, 41.887738208, 41.861076976, 41.748060338, 41.797383158, 41.88173662, 41.778730518, 41.85268013, 41.881631341, 41.942848288, 41.845968863, 41.82975435, 41.972402958, 41.887904127, 41.779605366, 41.842878515, 41.801676043, 41.878856397, 41.895736721, 41.883294122, 41.692587367, 41.969048214, 41.800863975, 41.897021372, 41.896176088, 41.749869687, 41.869703985, 41.891303157, 41.799553224, 41.804996145, 41.891537223, 41.998116778, 41.799592827, 41.766493357, 41.886893085, 41.898643242, 41.901222485, 41.905376422, 41.924250576, 41.779704993, 41.814471837, 41.994587832, 41.992541921, 41.964313223, 41.873517205, 41.889930121, 41.877735349, 41.705267858, 41.877600872, 41.86167498, 41.937010053, 41.895077107, 41.855785481, 41.865783217, 41.752149728, 41.751443901, 41.884923991, 41.781807171, 41.764303087, 41.845298749, 41.707766086, 41.86630331, 41.936740755, 41.745382548, 41.783316167, 41.726028494, 41.978086971, 41.881774957, 41.879860127, 41.755965725, 41.875355342, 41.810836292, 41.850957372, 41.870146835, 41.903929378, 41.873944069, 41.775659328, 41.812390862, 41.917233894, 41.706925829, 41.866312328, 41.827520746, 41.779826802, 41.733235848, 41.737200229, 41.779597995, 41.77113044, 41.805679886, 41.751198244, 41.89338448, 41.895404051, 41.881991899, 41.931994735, 41.814133279, 41.862023566, 41.880070565, 41.995159052, 41.899189017, 41.91072397, 41.929242595, 41.865000681, 41.899327779, 41.861105328, 41.77543953, 41.692300442, 41.972845315, 41.886530514, 41.991404284, 41.796942971, 41.765907195, 41.867097632, 41.670095481, 41.799978827, 41.901324508, 41.903561493, 41.902502165, 41.982407209, 41.762166567, 41.880386193, 41.76220193, 41.859036393, 41.821461084, 41.856294972, 41.899980028, 41.787380329, 41.968305606, 41.736129473, 41.803474876, 41.779897875, 41.883096319, 41.889763017, 41.931291627, 41.892300375, 41.899227252, 42.007187234, 41.878506591, 41.879827197, 41.932892097, 41.747090733, 41.756617188, 41.873839312, 41.777658506, 41.735143667, 41.867182042, 41.872709648, 41.931042314, 41.802660667, 41.773007423, 41.998915651, 41.877718066, 41.709590134, 41.868978047, 41.764762794, 41.908262619, 41.74519462, 41.761017387, 41.780792313, 41.855906242, 41.967458424, 41.863588895, 41.811838512, 41.825194431, 41.873991018, 41.656738592, 41.685702753, 41.894960427, 41.766738169, 41.976095027, 41.87683815, 41.751732099, 41.989694347, 41.766025213, 41.851015522, 41.794708258, 41.736277091, 41.864070063, 41.881833204, 41.953411521, 41.884613395, 41.902765473, 41.95285778, 41.777950825, 41.851268765, 41.817939584, 41.924228431, 41.889046347, 41.872848316, 41.844514992, 41.814105006, 41.858213965, 41.847688972, 41.722445994, 41.928986675, 41.910316566, 41.808069268, 41.80159966, 41.645795847, 41.7816281, 41.786639531, 41.785891646, 41.90265577, 41.738691386, 41.86703917, 41.749850478, 41.684847301, 41.770189163, 41.861698243, 41.877745385, 41.723340547, 41.721110998, 41.670633685, 41.968569215, 41.896312833, 41.860230608, 41.833679765, 41.764918291, 41.894945957, 41.751328486, 41.908880377, 41.879635827, 41.882993996, 41.792342253, 41.883210189, 41.881828083, 41.880932187, 41.867123749, 41.897086966, 41.849173995, 41.808132886, 41.792634413, 41.889243957, 41.96735854, 41.890034161, 41.808608378, 41.777601657, 41.909553442, 41.966108362, 41.885533988, 41.900752739, 41.764397089, 41.909386659, 41.880483386, 41.881738601, 41.851377353, 41.885739108, 41.784399043, 41.779150271, 41.893817529, 41.754787799, 41.883203377, 41.786931638, 41.75004881, 41.878083759, 41.758078549, 41.902829376, 41.769373492, 41.883516261, 41.960778173, 41.729458085, 41.87799875, 41.890790266, 41.886028822, 41.745007012, 41.832156013, 41.895978014, 41.89381431, 41.693879672, 41.928258322, 41.88301997, 41.892516832, 41.808187634, 42.017183146, 42.019973942, 41.844538907, 41.736369941, 41.757374833, 41.887282776, 41.750702661, 41.864096311, 41.782260071, 41.898697342, 41.940160451, 41.939211601, 41.774838063, 41.65685118, 41.742084508, 41.783872708, 41.993108732, 41.878176784, 41.898326955, 41.866313546, 41.839113859, 41.758365623, 41.864525633, 41.806627559, 41.899945921, 41.885013623, 41.750957692, 41.870975935, 41.864975822, 41.889203826, 41.877101586, 41.910341711, 41.809771899, 41.898532573, 41.909139303, 41.941776585, 41.883368801, 41.752762491, 41.878223415, 41.906443068, 41.892164276, 41.844073188, 41.861943987, 41.707340063, 41.864062245, 41.891004201, 41.694120148, 41.70592204, 41.675253432, 41.82443057, 42.004480346, 41.892479421, 41.89005498, 41.768686795, 41.790665284, 41.780408338, 41.953403719, 41.762064717, 41.896637081, 41.902578855, 41.779109284, 41.815878016, 41.90320247, 41.940499266, 41.897413995, 41.952820036, 41.910533752, 41.804911724, 41.876461817, 41.905276989, 41.789655791, 41.891179152, 41.759063007, 41.686261889, 41.902187338, 41.946241881, 41.798715563, 41.883804454, 41.961287044, 41.793234801, 41.725449081, 41.903402827, 41.886609082, 41.984685103, 42.019811963, 41.760327809, 41.699927519, 41.87494711, 41.65548171, 41.90938675, 41.909608368, 41.705269548, 41.821177006, 41.933929729, 41.91114034, 41.959239131, 41.721220015, 41.795549141, 41.880490151, 41.929218212, 41.892497624, 41.753807493, 41.903785974, 41.994546335, 41.711920502, 41.847599712, 41.795111262, 41.912233137, 41.736675238, 41.799167724, 41.758138498, 41.879811462, 41.880655171, 41.811606934, 41.901377109, 41.937431969, 41.890317598, 41.739098284, 41.780605319, 41.910886107, 41.799197912, 41.784474741, 41.76022697, 41.852023717, 41.931391665, 41.883651857, 41.827851531, 41.877482909, 41.880710146, 41.781515569, 41.802033196, 41.78015499, 41.921849049, 41.779984558, 41.797414808, 41.683896564, 41.707331718, 41.807083442, 41.880259491, 41.908923397, 41.933836412, 41.981295861, 41.789817132, 41.67136538, 41.879391764, 41.884493832, 41.748223081, 41.862132355, 41.775818341, 41.972134016, 41.788358466, 41.948533921, 41.759655503, 41.886237872, 41.885908101, 41.881973488, 41.871191211, 41.781646505, 41.946391574, 41.862853002, 41.773967711, 41.89362549, 41.982777739, 41.883091389, 41.950603731, 41.895705767, 41.901367155, 41.821767828, 41.791699487, 41.730949275, 41.930809567, 41.885731591, 41.707535018, 41.787014838, 41.909676677, 41.866862652, 41.777744971, 41.880251406, 41.688214048, 41.793912094, 41.79340561, 41.797949772, 41.765157518, 41.909023481, 41.786439251, 41.752203876, 41.761661446, 41.909422255, 41.752371637, 41.885182294, 41.86606099, 41.750819013, 41.880771366, 41.913861315, 41.881271147, 41.767761302, 41.903570031, 41.887739656, 41.852264776, 41.787074218, 41.745770795, 41.739622085, 41.75313973, 41.978468614, 41.881084011, 41.868302711, 41.844334316, 41.878092571, 41.855520321, 41.890732628, 41.886406416, 41.882851552, 41.945591853, 41.830685937, 41.899258732, 41.895429461, 41.843074007, 41.735066839, 41.816180724, 41.756115887, 42.012259884, 41.94593982, 41.996043193, 41.885280845, 41.929700376, 41.75135862, 41.746852511, 41.898008153, 41.802357499, 41.810663246, 41.901931351, 41.878531497, 41.780415378, 42.020271587, 41.879909765, 41.779930114, 41.790413648, 41.68508339, 41.855748174, 41.831548932, 41.979426783, 41.779004438, 41.881007008, 41.677425416, 41.684807004, 41.756024579, 41.880257779, 41.848131849, 41.778996043, 41.877900503, 41.773068142, 41.808645557, 41.795764158, 41.892297612, 41.799518433, 41.895028832, 41.76540594, 41.88548283, 41.731564657, 41.882209936, 41.730127277, 41.82906505, 41.766344566, 41.736508334, 41.910090832, 41.909715599, 41.784395569, 41.672225539, 41.906954091, 41.770672458, 41.90068107, 41.90950483, 41.952908208, 41.90215894, 41.851472218, 41.921093508, 42.011544945, 41.756249125, 41.991335662, 41.880933395, 41.880511308, 41.780226662, 42.007407039, 41.9305046, 41.914338356, 41.888366748, 41.79612454, 41.896335387, 41.939149955, 41.764328821, 41.742334513, 41.879468598, 41.92464673, 41.868278395, 41.751119567, 41.890079607, 41.830651986, 41.930108831, 41.887443217, 41.885808136, 41.778901304, 41.817506771, 41.757057579, 41.895080471, 41.886815622, 41.902678812, 41.894048023, 41.755923803, 42.01034291, 41.871781022, 41.893797199, 41.9225978, 41.878113871, 41.971852622, 41.972359593, 41.724494263, 41.783536746, 41.793390915, 41.702997566, 41.735994703, 41.755859312, 41.880992663, 41.786932412, 41.871520566, 41.767581306, 41.799462979, 41.756507401, 41.876652229, 41.687056038, 41.686879951, 41.794439271, 41.866147972, 41.877905955, 41.938866781, 41.922072515, 41.739622639, 41.881418867, 41.87285385, 41.88275944, 41.877969824, 42.01390135, 41.786681785, 41.861022663, 41.851487242, 41.736047095, 41.975570342, 41.722108211, 41.939290467, 41.816012995, 41.744536265, 41.795463586, 41.746242343, 41.782207371, 41.941185738, 41.878319716, 41.864177046, 41.884688197, 41.71351467, 41.953200167, 41.881016537, 41.809803372, 41.750187225, 42.017006715, 41.795298999, 41.845770099, 41.984410822, 41.774216041, 41.877556996, 41.881022767, 41.880652933, 41.946367827, 41.878916094, 41.801583507, 41.881047766, 41.743557554, 41.878563206, 41.931582761, 41.78000107, 41.789836176, 41.678566166, 41.8792792, 41.814345252, 41.767148983, 41.965425822, 41.877500741, 41.9100792, 41.779572187, 42.007865562, 41.808509341, 41.809346801, 41.830490151, 41.746660544, 41.752928683, 41.764674182, 41.690273866, 41.722460108, 41.882425241, 41.909471035, 42.005529062, 41.767861423, 41.94576613, 41.733928755, 41.836806313, 41.758739878, 41.917338545, 41.882994967, 41.946427834, 41.897627277, 41.882249994, 41.742433848, 41.946598555, 41.880689195, 41.902991231, 41.879632285, 41.847681516, 41.744799407, 41.884473752, 41.991494898, 41.890961404, 41.875683703, 41.931271634, 41.860238349, 41.89484426, 41.882379941, 41.939309171, 41.825008437, 41.77178664, 41.736855332, 41.963978407, 41.961184538, 41.988179091, 41.780390363, 41.769255825, 41.880161534, 42.012293397, 41.720969202, 42.02025525, 41.795511377, 41.919345195, 41.965453015, 41.873889276, 41.908886162, 41.756713129, 41.890056666, 41.998368301, 41.806989137, 41.856326285, 41.850025388, 41.879043079, 42.004694436, 41.81278547, 41.879069903, 41.802115448, 41.879634247, 42.013113175, 41.816229907, 41.824976728, 41.89658837, 41.828743353, 41.880898957, 41.864371917, 41.78884005, 41.866744918, 41.89158884, 41.91081797, 41.783582287, 41.879104092, 41.88331975, 41.980039853, 41.75035324, 41.886816689, 41.805239693, 41.88173675, 41.905536444, 41.786482148, 41.882736633, 41.863935243, 41.86645124, 41.759162013, 41.875056172, 41.783276387, 41.983553381, 41.783325684, 41.853910939, 41.911084257, 41.8848616, 41.73585412, 41.880565994, 41.882446804, 41.831073285, 41.901842459, 41.893137832, 41.803318702, 41.878860159, 41.877567416, 41.769431669, 41.939330941, 41.766521041, 41.96106725, 41.744976048, 41.908570145, 41.930966504, 41.764739071, 41.881097305, 41.729407053, 41.925617492, 41.917425774, 41.854335843, 41.878017787, 41.755500696, 41.938020384, 41.771171016, 41.790320325, 41.878038501, 41.712997401, 41.791547317, 41.876926579, 41.849954132, 41.995366855, 41.853468388, 41.876683313, 41.840492863, 41.897267498, 41.968810413, 41.929189918, 41.750285238, 41.858579571, 41.749837103, 41.766056625, 41.8405527, 41.918607701, 41.861404132, 41.735033879, 41.857561923, 41.877481507, 41.793241202, 41.829614746, 41.715336835, 41.814470499, 41.877078434, 41.801393988, 41.939286479, 41.780247905, 41.811741323, 41.786873855, 41.975739484, 41.744997768, 41.880932047, 41.893119413, 41.744226478, 41.681268942, 41.860300917, 41.801809043, 41.949390691, 41.803754843, 41.812719607, 41.758331912, 41.748062093, 41.896089327, 41.726058329, 42.005637434, 41.88360569, 41.819697049, 41.886345263, 41.80317932, 41.82618602, 41.773779022, 41.980435794, 41.823667594, 41.778751636, 41.867263017, 41.865576557, 41.808966952, 41.795987556, 41.880432396, 41.737158469, 41.750409276, 41.891135724, 41.827301603, 41.964249329, 41.692289426, 41.934304581, 41.883627156, 41.752719419, 41.900001579, 41.781734181, 41.891308785, 41.908898648, 41.809294262, 41.677478385, 41.8960672, 41.900424796, 41.950197458, 41.783285879, 41.90802185], "legendgroup": "", "lon": [-87.905227221, -87.741528537, -87.627876698, -87.624096605, -87.628203192, -87.742728815, -87.726422045, -87.647000785, -87.74147999, -87.627841791, -87.624485177, -87.628068782, -87.572998178, -87.637460623, -87.604893749, -87.611461502, -87.709271389, -87.906463155, -87.629070243, -87.653645803, -87.628331665, -87.675049485, -87.639235361, -87.625185222, -87.624131266, -87.573539169, -87.905312411, -87.643013039, -87.684273777, -87.586502002, -87.639158, -87.627644063, -87.627844798, -87.639680572, -87.638509526, -87.630542489, -87.625817031, -87.627760426, -87.66571041, -87.76551063, -87.639324074, -87.640802922, -87.626155832, -87.601839023, -87.625732415, -87.60431945, -87.557845321, -87.666379171, -87.605224746, -87.707248137, -87.704705156, -87.627075368, -87.634088181, -87.665923635, -87.628445336, -87.620528559, -87.624193896, -87.746273229, -87.736084376, -87.640060441, -87.622937212, -87.687011559, -87.688248952, -87.629906972, -87.617516172, -87.612291851, -87.627026373, -87.72089612, -87.707276938, -87.683123746, -87.680298775, -87.72198373, -87.616983146, -87.763346345, -87.639585621, -87.600944364, -87.653288878, -87.708829783, -87.69378445, -87.624152861, -87.660305558, -87.643080489, -87.627029017, -87.6304532, -87.631460067, -87.537357913, -87.625816668, -87.601635756, -87.65474101, -87.627691486, -87.683713146, -87.900983721, -87.617209584, -87.786301606, -87.723855981, -87.627031661, -87.699510379, -87.586115266, -87.614451899, -87.62743954, -87.653351515, -87.644077264, -87.628942582, -87.605619683, -87.747016581, -87.735882518, -87.614436164, -87.631590568, -87.623871195, -87.627850543, -87.688848758, -87.706566627, -87.659941972, -87.620244029, -87.791440835, -87.663785792, -87.621995369, -87.664593068, -87.627915459, -87.714849143, -87.702155577, -87.665119726, -87.614476891, -87.679374655, -87.619756522, -87.630703621, -87.726052394, -87.637267875, -87.753008553, -87.627768243, -87.689421855, -87.644610871, -87.627942238, -87.80576669, -87.647367397, -87.652406156, -87.64613311, -87.7414552, -87.624255632, -87.624097243, -87.674525788, -87.590528166, -87.624165306, -87.741385006, -87.723370404, -87.606558389, -87.64250581, -87.625813624, -87.631438536, -87.694524884, -87.643246928, -87.663426378, -87.700488807, -87.780130326, -87.66382344, -87.626923253, -87.639211587, -87.624187857, -87.645195215, -87.783396923, -87.627847625, -87.627029031, -87.664046556, -87.657992984, -87.662687356, -87.677913394, -87.788962647, -87.664208692, -87.576292427, -87.755847438, -87.654999693, -87.643199348, -87.907472601, -87.703792065, -87.754281422, -87.684893829, -87.657890403, -87.630703226, -87.640753492, -87.639594427, -87.635503335, -87.702293402, -87.668978317, -87.580708771, -87.638224621, -87.633564301, -87.635406033, -87.720764494, -87.62152816, -87.745137513, -87.662706548, -87.640009077, -87.615617777, -87.658120918, -87.63091491, -87.744957048, -87.626342565, -87.605921959, -87.612880723, -87.627067195, -87.624095634, -87.664386014, -87.665057703, -87.624119338, -87.605758495, -87.685081252, -87.62820806, -87.624279065, -87.675300318, -87.655545441, -87.768532463, -87.742747165, -87.624116333, -87.663547848, -87.745300725, -87.644173224, -87.663629657, -87.576478539, -87.725430093, -87.762690091, -87.6913338, -87.684368169, -87.627288482, -87.663878589, -87.623527134, -87.669066936, -87.623717187, -87.720517147, -87.659110921, -87.685920733, -87.576294705, -87.620196651, -87.552855036, -87.604855911, -87.695744714, -87.713495268, -87.633828531, -87.615601416, -87.639087164, -87.569290282, -87.691501175, -87.585708249, -87.644495002, -87.613135895, -87.626847966, -87.763674222, -87.718967674, -87.623096746, -87.75033191, -87.630937377, -87.695199039, -87.624091323, -87.722390196, -87.627935689, -87.650710119, -87.634790696, -87.746056778, -87.627021086, -87.644401916, -87.717896689, -87.63598179, -87.625429032, -87.615596501, -87.615319213, -87.67275327, -87.629175344, -87.644029945, -87.641536792, -87.627214427, -87.711154301, -87.644078325, -87.655984213, -87.649576033, -87.646579678, -87.627813307, -87.551244573, -87.635083754, -87.667375699, -87.618954852, -87.601726053, -87.613016949, -87.66456619, -87.644774188, -87.702173146, -87.626860911, -87.62891376, -87.626979903, -87.628741678, -87.629701805, -87.753663295, -87.65350869, -87.653642482, -87.627069839, -87.527258234, -87.767781443, -87.785547998, -87.612570753, -87.556752911, -87.642147208, -87.627666954, -87.654579713, -87.623841071, -87.624346184, -87.654410045, -87.683673325, -87.628442902, -87.588157998, -87.654929158, -87.616145232, -87.613677631, -87.636673298, -87.557038686, -87.673896581, -87.579798041, -87.63115524, -87.625680278, -87.616562762, -87.615255549, -87.708424071, -87.650000625, -87.712670479, -87.65976218, -87.629184056, -87.723251281, -87.765198001, -87.624469241, -87.627994833, -87.628541987, -87.624397882, -87.586387726, -87.586130225, -87.668504341, -87.670011875, -87.628939124, -87.792881805, -87.594427666, -87.596653142, -87.723245665, -87.591967028, -87.614817819, -87.738567526, -87.585957168, -87.754874977, -87.904976266, -87.626906181, -87.620651734, -87.766294416, -87.645527495, -87.591497227, -87.586321063, -87.645565723, -87.627683859, -87.65560801, -87.708840106, -87.631711749, -87.706110174, -87.665865852, -87.716221792, -87.890372151, -87.667566751, -87.624153044, -87.604815966, -87.631462688, -87.760921537, -87.604954085, -87.673208159, -87.7144777, -87.689596768, -87.624538423, -87.699545765, -87.615568353, -87.642987258, -87.642189656, -87.628061509, -87.646455447, -87.68563492, -87.55133578, -87.725475051, -87.621046145, -87.606892634, -87.649815884, -87.626709904, -87.627514417, -87.672983233, -87.755587101, -87.683627986, -87.663332294, -87.626401638, -87.645517082, -87.602725951, -87.674368991, -87.69730355, -87.620603115, -87.731186405, -87.628834415, -87.558073456, -87.775425225, -87.723765071, -87.71733391, -87.746113681, -87.625340136, -87.69445629, -87.567294437, -87.6269207, -87.675220451, -87.665219378, -87.634195294, -87.632455489, -87.592464611, -87.626962834, -87.559870854, -87.586451255, -87.774281815, -87.622824022, -87.591933595, -87.702084879, -87.652509775, -87.645505595, -87.693823763, -87.617317037, -87.736181, -87.631906508, -87.721631784, -87.644030737, -87.72628358, -87.708253555, -87.632206293, -87.734045986, -87.586294711, -87.699285044, -87.67484904, -87.667837814, -87.663966368, -87.68367553, -87.618995915, -87.629210442, -87.615522623, -87.627876969, -87.688162342, -87.690074383, -87.754996996, -87.645142068, -87.626668445, -87.633567673, -87.618919216, -87.562813204, -87.615600014, -87.699348928, -87.58382047, -87.714356095, -87.614956494, -87.68938138, -87.627609439, -87.674377204, -87.595822806, -87.604430616, -87.73926766, -87.605938082, -87.649625167, -87.657654526, -87.664961971, -87.628078719, -87.639582928, -87.6276188, -87.552669707, -87.641490211, -87.624347038, -87.731150217, -87.645453608, -87.579757023, -87.631433102, -87.628265515, -87.703963414, -87.66400571, -87.628106353, -87.883611316, -87.648852157, -87.60501807, -87.67083136, -87.683468276, -87.628569146, -87.628361716, -87.615162409, -87.668606344, -87.634278086, -87.660962362, -87.623104662, -87.629548167, -87.630979425, -87.625500912, -87.66929687, -87.723350952, -87.624945647, -87.62510451, -87.73531182, -87.620983384, -87.644063902, -87.75522124, -87.720539406, -87.662497935, -87.615558249, -87.605175838, -87.666333791, -87.767912706, -87.626497604, -87.651606387, -87.640660777, -87.638726692, -87.636913058, -87.620503762, -87.674545335, -87.674384528, -87.660855375, -87.723903515, -87.628311641, -87.632421239, -87.627962486, -87.628019052, -87.624524028, -87.683188577, -87.623435005, -87.664206366, -87.729569215, -87.649510899, -87.749169703, -87.726152565, -87.627133239, -87.643103491, -87.710081187, -87.643278183, -87.551419766, -87.665183168, -87.603994347, -87.750161722, -87.620917415, -87.692447486, -87.633208786, -87.603843747, -87.615660095, -87.562692028, -87.783400598, -87.647309981, -87.683180808, -87.627896757, -87.623247369, -87.629370032, -87.571098146, -87.593125671, -87.634686145, -87.720935733, -87.76527117, -87.705973505, -87.626977894, -87.764581664, -87.612052585, -87.656538409, -87.649366085, -87.626113652, -87.655181405, -87.675199089, -87.652036281, -87.683764609, -87.624410361, -87.627718261, -87.668500261, -87.623815165, -87.665351128, -87.688750258, -87.674970791, -87.631785431, -87.76702211, -87.723039647, -87.686329083, -87.635628328, -87.626840187, -87.579756798, -87.586402447, -87.631177143, -87.624251314, -87.765521526, -87.641772074, -87.676784841, -87.682084152, -87.68479102, -87.625206276, -87.622100808, -87.627847776, -87.663314347, -87.559231739, -87.624719943, -87.62857278, -87.646313633, -87.671992307, -87.615599494, -87.544364336, -87.644525308, -87.65886264, -87.606854782, -87.663426578, -87.660110993, -87.652311296, -87.709440657, -87.62741936, -87.579836586, -87.674225948, -87.622745105, -87.644633853, -87.561272312, -87.703122242, -87.664766276, -87.696934918, -87.667573631, -87.55806373, -87.627551654, -87.615701737, -87.723376202, -87.651052567, -87.624896894, -87.718953928, -87.647342333, -87.624206307, -87.673855622, -87.573789768, -87.755370011, -87.688249516, -87.561510616, -87.704673571, -87.724846958, -87.624109917, -87.637698101, -87.664252074, -87.610277459, -87.661698689, -87.548046864, -87.603072021, -87.632648229, -87.624374606, -87.623456938, -87.631310613, -87.575969317, -87.672293669, -87.683229302, -87.703313645, -87.624222942, -87.789987521, -87.733797258, -87.703859846, -87.624137626, -87.627733247, -87.627596446, -87.683327303, -87.627620993, -87.649323127, -87.623426629, -87.709360238, -87.717043381, -87.626996239, -87.683929054, -87.626661308, -87.673125651, -87.683916158, -87.627340674, -87.764194002, -87.649187069, -87.65274758, -87.652675042, -87.664282585, -87.615319321, -87.610058377, -87.745204753, -87.745627875, -87.682838316, -87.552892516, -87.720473094, -87.622682706, -87.644024788, -87.663942241, -87.616947314, -87.660921846, -87.632182661, -87.624341423, -87.613705645, -87.627667799, -87.627929503, -87.765095923, -87.706866213, -87.619839586, -87.619141016, -87.703753695, -87.645341277, -87.706183852, -87.690163597, -87.551207132, -87.696642296, -87.608062183, -87.737712004, -87.738469028, -87.635351487, -87.644639452, -87.662382149, -87.731763004, -87.627231186, -87.676578363, -87.770558224, -87.6243529, -87.722175346, -87.619003708, -87.628076963, -87.662706932, -87.636706827, -87.71104513, -87.623203203, -87.586085395, -87.631760999, -87.746419366, -87.625328663, -87.743552438, -87.613856692, -87.585822373, -87.671104423, -87.605838376, -87.680277948, -87.624137033, -87.628142362, -87.63243193, -87.557976827, -87.649416212, -87.755620452, -87.658338686, -87.627935448, -87.654760481, -87.624141504, -87.642819913, -87.676875003, -87.74438154, -87.622042783, -87.657716788, -87.647514742, -87.674031424, -87.654390481, -87.717806169, -87.750783005, -87.654825814, -87.644408194, -87.755348129, -87.712512617, -87.551092573, -87.653369734, -87.636176148, -87.55289378, -87.647107189, -87.665162422, -87.710210418, -87.615968735, -87.629125336, -87.646762046, -87.563800456, -87.57632989, -87.757786441, -87.665577234, -87.655873595, -87.746755729, -87.626852618, -87.563193271, -87.699296047, -87.629339891, -87.615566126, -87.619113763, -87.552238463, -87.652995284, -87.621050648, -87.699795456, -87.66337071, -87.665045312, -87.625690175, -87.701390474, -87.63471588, -87.616847182, -87.655227542, -87.606425428, -87.664342629, -87.654795347, -87.702891376, -87.655266727, -87.586450869, -87.648578343, -87.698107558, -87.742991505, -87.686445186, -87.622063199, -87.624134682, -87.684860827, -87.668826246, -87.762141971, -87.566530745, -87.625182794, -87.63136393, -87.626258734, -87.609476619, -87.723303209, -87.619164088, -87.603952966, -87.643036076, -87.667498444, -87.675866628, -87.765078145, -87.689987495, -87.645458414, -87.659636657, -87.745887499, -87.625958436, -87.678199026, -87.756066167, -87.638388243, -87.688801046, -87.664682949, -87.628828268, -87.615561058, -87.626934833, -87.613033345, -87.630001432, -87.620686081, -87.613413281, -87.614131833, -87.616020877, -87.622099893, -87.617191438, -87.641648739, -87.765501067, -87.732550205, -87.705924314, -87.674768971, -87.738831483, -87.765098817, -87.643230238, -87.543041152, -87.615696882, -87.615558035, -87.625515824, -87.613503857, -87.576095781, -87.657389725, -87.72547164, -87.744926805, -87.632055653, -87.675868666, -87.63153437, -87.560215615, -87.71174182, -87.615520426, -87.664668469, -87.572709347, -87.714765311, -87.718303732, -87.586243072, -87.575373855, -87.653867946, -87.615515144, -87.643107045, -87.684420054, -87.752850634, -87.626365813, -87.603034703, -87.624567581, -87.755021121, -87.644268517, -87.629204627, -87.636183854, -87.560182233, -87.625448401, -87.763607487, -87.552790944, -87.736189335, -87.656117076, -87.588007653, -87.603919835, -87.613418466, -87.812829371, -87.642053002, -87.707973888, -87.655016254, -87.626818503, -87.901364605, -87.649500126, -87.742952841, -87.643252484, -87.654302474, -87.724699662, -87.552581647, -87.745917518, -87.55303151, -87.713489726, -87.616989442, -87.6978538, -87.66674162, -87.728733158, -87.629282088, -87.627981404, -87.628442088, -87.68885364, -87.631814251, -87.622731926, -87.64960867, -87.617271544, -87.6015084, -87.625601621, -87.655678044, -87.787536961, -87.667927739, -87.576191815, -87.689219118, -87.624380767, -87.787860507, -87.622315729, -87.740567984, -87.626304822, -87.592600053, -87.575344529, -87.603628907, -87.631344503, -87.56000975, -87.594156219, -87.619266937, -87.615636574, -87.615558861, -87.786783523, -87.690186314, -87.624184899, -87.644659401, -87.626851797, -87.645045119, -87.61677038, -87.724226209, -87.566227001, -87.616210158, -87.629391908, -87.585797123, -87.737940272, -87.698898226, -87.605119541, -87.627964177, -87.759014768, -87.750117639, -87.603808532, -87.703846021, -87.607582382, -87.600163368, -87.614452924, -87.648122217, -87.624521539, -87.604362828, -87.740843921, -87.628275435, -87.754655732, -87.645372621, -87.601274245, -87.766357256, -87.62609605, -87.751010889, -87.621454706, -87.625396491, -87.753842755, -87.70640419, -87.644956704, -87.746724879, -87.654812168, -87.585137009, -87.836582104, -87.682568055, -87.682801662, -87.629412971, -87.653324829, -87.658064717, -87.567022232, -87.716062887, -87.644308897, -87.624527215, -87.686468002, -87.629547745, -87.664299154, -87.614802244, -87.668693783, -87.603810519, -87.552716204, -87.566637641, -87.65449147, -87.687781609, -87.6241128, -87.667906709, -87.608064205, -87.644581852, -87.693695901, -87.598557379, -87.641651267, -87.660150847, -87.751396529, -87.718334431, -87.561511043, -87.63140683, -87.554966924, -87.653195042, -87.612552184, -87.629505318, -87.65453007, -87.668314197, -87.559590955, -87.744991122, -87.745814792, -87.644355406, -87.635737508, -87.71122829, -87.705428851, -87.626902264, -87.605070606, -87.70296877, -87.759290438, -87.617141911, -87.628073894, -87.721894004, -87.631967753, -87.723151723, -87.64510423, -87.585638764, -87.746261068, -87.64458443, -87.701420232, -87.905108161, -87.754163303, -87.623450463, -87.621001903, -87.624279065, -87.670833516, -87.683232026, -87.624545946, -87.605608794, -87.62504512, -87.711659284, -87.639397357, -87.627105604, -87.642511973, -87.669491958, -87.697062077, -87.66342156, -87.635864574, -87.729525431, -87.686489297, -87.687784384, -87.764614167, -87.616795523, -87.652337017, -87.633301738, -87.649180491, -87.72648318, -87.605159961, -87.663145149, -87.61932306, -87.567306284, -87.624486846, -87.631189677, -87.720221957, -87.652715044, -87.736089224, -87.629208475, -87.572455541, -87.626649565, -87.696669693, -87.628129354, -87.743142974, -87.632361012, -87.710357367, -87.644017035, -87.601400234, -87.664229139, -87.60674129, -87.721187148, -87.721810393, -87.711267556, -87.766424778, -87.622354657, -87.629855197, -87.67800053, -87.647607586, -87.644213747, -87.606001759, -87.576291395, -87.663053811, -87.630183362, -87.654791654, -87.625519384, -87.659812184, -87.608524835, -87.623777956, -87.765439838, -87.605376887, -87.714904997, -87.661433463, -87.624642127, -87.7187477, -87.711613381, -87.669951491, -87.643202686, -87.673547448, -87.616411124, -87.66424283, -87.674270532, -87.581893417, -87.672339218, -87.620277064, -87.694846269, -87.617043461, -87.620779831, -87.705130816, -87.586154041, -87.628466349, -87.68951845, -87.68057571, -87.748259978, -87.72801475, -87.759559887, -87.680040875, -87.635528609, -87.691888057, -87.625958859, -87.70326286, -87.726096446, -87.678222877, -87.627080475, -87.582853494, -87.81119077, -87.615649806, -87.62580711, -87.658712242, -87.664480186, -87.688888738, -87.70357593, -87.714178443, -87.720330031, -87.671793655, -87.590467932, -87.733380777, -87.675302757, -87.685871795, -87.615515359, -87.665565006, -87.628685126, -87.651032417, -87.623570871, -87.746049479, -87.617716013, -87.623784263, -87.620432585, -87.617297398, -87.652925956, -87.73858166, -87.58630763, -87.641301791, -87.66514317, -87.574717019, -87.550270556, -87.589834384, -87.583799955, -87.670164416, -87.627874384, -87.649971265, -87.703135682, -87.727638664, -87.695178701, -87.668125318, -87.620644613, -87.629284766, -87.625813935, -87.64491897, -87.578975856, -87.649516667, -87.674675749, -87.617065931, -87.765022234, -87.725665179, -87.531658377, -87.634427475, -87.625838595, -87.836588785, -87.605960056, -87.624523664, -87.620785048, -87.630138783, -87.675428114, -87.605329791, -87.643184156, -87.585594973, -87.727269139, -87.746915859, -87.634124064, -87.662437948, -87.629427024, -87.667997673, -87.598061446, -87.680799226, -87.606301777, -87.726882186, -87.641255151, -87.632283818, -87.606551046, -87.735272577, -87.711736421, -87.591773761, -87.726398267, -87.745964635, -87.721377025, -87.616576329, -87.693790049, -87.664205796, -87.703539139, -87.65510293, -87.69221554, -87.626643572, -87.682272891, -87.701884089, -87.78748829, -87.712171295, -87.642473797, -87.635025125, -87.765412092, -87.632045722, -87.639713484, -87.633734743, -87.698572821, -87.6171782, -87.769969735, -87.641649599, -87.649787936, -87.606674143, -87.632650679, -87.728781177, -87.627706271, -87.726475653, -87.705080327, -87.766068398, -87.585636406, -87.60687678, -87.628989611, -87.649386514, -87.644769378, -87.55895132, -87.688652292, -87.657214823, -87.604641957, -87.643058205, -87.692710749, -87.626890005, -87.693381423, -87.630832031, -87.626807395, -87.62911796, -87.612198632, -87.623213022, -87.658258453, -87.65559428, -87.641168032, -87.656304974, -87.653552149, -87.62750777, -87.590234482, -87.743044463, -87.638427474, -87.655722728, -87.6438161, -87.670589881, -87.616147829, -87.65034213, -87.614400269, -87.624560336, -87.752457779, -87.649353839, -87.551379554, -87.726635552, -87.585438607, -87.6242787, -87.616874156, -87.725945966, -87.60391608, -87.659679467, -87.699507229, -87.64941498, -87.702801419, -87.642593834, -87.776364792, -87.647298713, -87.767445112, -87.657748827, -87.694588249, -87.64386309, -87.683730159, -87.620592186, -87.629084946, -87.658166965, -87.628330712, -87.766025313, -87.733771557, -87.555333653, -87.629765732, -87.576133063, -87.588143196, -87.628908795, -87.586317625, -87.747006374, -87.568628671, -87.741703718, -87.643199555, -87.666379591, -87.620694297, -87.62474756, -87.649024588, -87.606702419, -87.663755557, -87.664290466, -87.649380278, -87.692770071, -87.707338303, -87.615915568, -87.590355138, -87.728811116, -87.734518833, -87.654124986, -87.623233908, -87.644305471, -87.651281486, -87.602638387, -87.575707974, -87.632312841, -87.627758535, -87.656615702, -87.624521781, -87.646645976, -87.746875622, -87.692520826, -87.62765089, -87.657089031, -87.624243734, -87.627499596, -87.735238688, -87.73040747, -87.694519666, -87.724361483, -87.622098929, -87.765707358, -87.642467755, -87.727964573, -87.743241545, -87.7335302, -87.634185138, -87.641893815, -87.626673634, -87.66363196, -87.765086511, -87.676214817, -87.61721984, -87.617013434, -87.630156699, -87.621658468, -87.693580269, -87.765353356, -87.648118305, -87.621061298, -87.757959152, -87.63262828, -87.750959284, -87.766599362, -87.671861659, -87.642954141, -87.739927261, -87.653967008, -87.622725822, -87.643601006, -87.668784595, -87.624358666, -87.654937629, -87.718670666, -87.57627519, -87.634396649, -87.624241063, -87.64407246, -87.616997089, -87.632847291, -87.627594292, -87.61722727, -87.615480591, -87.668718084, -87.624193198, -87.699396498, -87.654773202, -87.634266948, -87.656741053, -87.651221802, -87.661254473, -87.625732367, -87.621793581, -87.62642495, -87.699116854, -87.670006581, -87.746759503, -87.629308553, -87.641455374, -87.627665516, -87.619340283, -87.656457451, -87.615127644, -87.605224922, -87.660388215, -87.657205006, -87.615951236, -87.639055705, -87.627910223, -87.663241882, -87.836684841, -87.587978676, -87.700678316, -87.632341337, -87.611664319, -87.718184568, -87.624571908, -87.673580917, -87.602743451, -87.626953617, -87.653535923, -87.704715262, -87.643055717, -87.626470528, -87.706867809, -87.554536327, -87.695171094, -87.580442725, -87.682871596, -87.624243916, -87.64989918, -87.633396724, -87.646264459, -87.642031644, -87.642367883, -87.617674109, -87.710175647, -87.629294594, -87.643814722, -87.627477823, -87.629059469, -87.642892778, -87.653165399, -87.640940116, -87.644613656, -87.625035314, -87.658094107, -87.705031022, -87.637280329, -87.624223667, -87.673711855, -87.615563072, -87.721930788, -87.640065846, -87.84646896, -87.686645691, -87.706719713, -87.628864807, -87.692384042, -87.727149134, -87.764953242, -87.654835892, -87.588747571, -87.631072891, -87.756083772, -87.659880317, -87.653735437, -87.724086642, -87.663731403, -87.758371958, -87.68227253, -87.654804865, -87.573938576, -87.658967358, -87.62416567, -87.627844406, -87.755703376, -87.676536946, -87.630501466, -87.637028112, -87.616673471, -87.576943938, -87.723377074, -87.678466914, -87.773012281, -87.625603607, -87.725537965, -87.686253982, -87.629128536, -87.638793981, -87.670865933, -87.666864606, -87.654768679, -87.703651531, -87.619531469, -87.734570978, -87.70296528, -87.587465382, -87.645842759, -87.603808314, -87.63455036, -87.658635101, -87.653767961, -87.562587625, -87.622733535, -87.566086719, -87.700379148, -87.703922316, -87.676211793, -87.584044296, -87.604844389, -87.653627313, -87.569856281, -87.633060512, -87.557908051, -87.634456935, -87.665903469, -87.558853882, -87.615597022, -87.763029002, -87.62396241, -87.647557963, -87.649810542, -87.649275328, -87.656356397, -87.629337063, -87.604808666, -87.622098627, -87.636207661, -87.755903553, -87.630144384, -87.628654671, -87.562690836, -87.626238686, -87.65419967, -87.675061685, -87.621025854, -87.632452147, -87.63416226, -87.638802889, -87.731840051, -87.726390989, -87.699685293, -87.617815429, -87.695117274, -87.628194868, -87.644994062, -87.621330678, -87.635189547, -87.642634662, -87.621959165, -87.668163684, -87.686427074, -87.626497423, -87.657821704, -87.574796951, -87.624134464, -87.527768125, -87.629176054, -87.636063322, -87.623292218, -87.730673844, -87.606693651, -87.709734846, -87.678019189, -87.624362245, -87.631500365, -87.683481204, -87.755186031, -87.720554136, -87.683429837, -87.654771544, -87.64255203, -87.649437757, -87.626464221, -87.690032129, -87.663445006, -87.627732563, -87.605996318, -87.614398473, -87.755078443, -87.606048047, -87.704159294, -87.708035521, -87.710319284, -87.684414463, -87.65380275, -87.744856892, -87.624113021, -87.668121549, -87.656472706, -87.684848686, -87.551757398, -87.628848503, -87.646633525, -87.721733355, -87.684131464, -87.680142381, -87.639440457, -87.701122668, -87.745898649, -87.629533842, -87.56218712, -87.605331512, -87.657534129, -87.754893341, -87.643736581, -87.664809681, -87.627248537, -87.632387132, -87.624164426, -87.846467101, -87.713238008, -87.629946882, -87.683821839, -87.754524263, -87.624383802, -87.702002425, -87.665525159, -87.627331436, -87.713903871, -87.66381882, -87.737155987, -87.724529173, -87.703047685, -87.607644795, -87.667394686, -87.726160106, -87.618732403, -87.697457309, -87.657053213, -87.701271041, -87.722344693, -87.623478469, -87.672392642, -87.704685773, -87.678085051, -87.67220843, -87.651841553, -87.64150249, -87.63661199, -87.617611457, -87.747485772, -87.714655027, -87.674852215, -87.726608375, -87.696979547, -87.759720016, -87.640015058, -87.658588247, -87.700467444, -87.576218227, -87.62332729, -87.782802648, -87.653682861, -87.72630861, -87.567002336, -87.644378904, -87.679608149, -87.707930056, -87.645167671, -87.569854828, -87.629486511, -87.675854596, -87.645973056, -87.76565911, -87.603798903, -87.64574741, -87.728823362, -87.628599988, -87.717792133, -87.656965961, -87.72488284, -87.637932903, -87.740543983, -87.717218085, -87.649288171, -87.633560686, -87.630148953, -87.626070778, -87.655609079, -87.624142375, -87.636894268, -87.593347577, -87.632315523, -87.586402872, -87.624163883, -87.651995629, -87.664091468, -87.634656764, -87.671012579, -87.602308153, -87.625377411, -87.683777679, -87.653168121, -87.637246929, -87.558255664, -87.72449773, -87.654857841, -87.669934375, -87.628173505, -87.638503099, -87.63077557, -87.749133059, -87.701808336, -87.628581948, -87.584113638, -87.681808677, -87.62590563, -87.665329825, -87.72378279, -87.696946533, -87.726100784, -87.715544681, -87.657756697, -87.622021816, -87.654791122, -87.727268803, -87.625822134, -87.765080772, -87.624278264, -87.901514402, -87.666968951, -87.675001677, -87.613133735, -87.621015557, -87.665290751, -87.67655155, -87.705602716, -87.729726463, -87.765015813, -87.713929467, -87.717430811, -87.68498211, -87.655283903, -87.715818083, -87.532859912, -87.56501525, -87.644126664, -87.556553285, -87.683532573, -87.715731653, -87.685925328, -87.590829108, -87.639215155, -87.55088962, -87.66394187, -87.840745861, -87.726825268, -87.625780935, -87.767249835, -87.624313409, -87.703038145, -87.611675899, -87.627755557, -87.765064273, -87.664911196, -87.667525821, -87.743097373, -87.600921791, -87.651640495, -87.628038144, -87.64847244, -87.636320176, -87.626959873, -87.685207125, -87.625877455, -87.654626945, -87.586223523, -87.632512191, -87.683481398, -87.550433015, -87.660363435, -87.757077713, -87.829756604, -87.585023579, -87.554387446, -87.70463737, -87.570448042, -87.635402906, -87.654756322, -87.624204307, -87.664002225, -87.625610638, -87.600129909, -87.634586291, -87.673124235, -87.623243039, -87.698023476, -87.624909847, -87.664157893, -87.652872258, -87.723298581, -87.559802041, -87.606215806, -87.653363136, -87.592486791, -87.697357279, -87.556195869, -87.576477067, -87.677471499, -87.626098571, -87.666116797, -87.71974488, -87.649632877, -87.799970169, -87.630953163, -87.674502123, -87.643438342, -87.668824981, -87.741497836, -87.631644061, -87.561983199, -87.643239402, -87.736124908, -87.660438139, -87.608109527, -87.674394341, -87.631664996, -87.743795434, -87.629307346, -87.745955373, -87.763386087, -87.778448036, -87.748722719, -87.629158341, -87.654535186, -87.629682213, -87.629290187, -87.638493721, -87.667448716, -87.629894088, -87.702226415, -87.704441353, -87.682164298, -87.588447787, -87.625513163, -87.669480384, -87.625823296, -87.736835292, -87.765068733, -87.745058632, -87.632099778, -87.638419281, -87.706859996, -87.688124523, -87.702010464, -87.757011425, -87.653519985, -87.627608412, -87.694400341, -87.660761186, -87.615113401, -87.598166867, -87.569878083, -87.687861744, -87.686946988, -87.658435722, -87.606401292, -87.585403058, -87.665570118, -87.632534851, -87.722273552, -87.615659667, -87.649827084, -87.671181992, -87.705449136, -87.707892425, -87.616840751, -87.640653561, -87.761674181, -87.627998797, -87.628074498, -87.625987769, -87.702486995, -87.689365619, -87.554811094, -87.652387549, -87.663379392, -87.632245564, -87.604910522, -87.639638995, -87.689974258, -87.641411276, -87.618362824, -87.624355722, -87.628081503, -87.6239505, -87.631799109, -87.576256836, -87.663604147, -87.724191109, -87.655592844, -87.745297106, -87.666194455, -87.604904392, -87.701415852, -87.64429052, -87.576275351, -87.733328968, -87.649107679, -87.634472427, -87.751995844, -87.62657476, -87.72149816, -87.634426259, -87.736635084, -87.715759913, -87.724796627, -87.765135251, -87.637643663, -87.661008708, -87.65891695, -87.660569111, -87.762379293, -87.625325518, -87.629545308, -87.620618587, -87.615751308, -87.675101971, -87.646533906, -87.604863987, -87.637610961, -87.613752074, -87.719092279, -87.740699871, -87.616051012, -87.746114281, -87.624550742, -87.620225683, -87.694944304, -87.761016679, -87.658080081, -87.722171321, -87.699311888, -87.670664922, -87.675567181, -87.649469376, -87.691188718, -87.634050522, -87.676368411, -87.724533469, -87.659532372, -87.615599831, -87.690258545, -87.640974928, -87.738515564, -87.652757947, -87.699510196, -87.687232407, -87.630734438, -87.76340479, -87.621442383, -87.631438294, -87.705028372, -87.717377577, -87.702192623, -87.618644375, -87.629356347, -87.651058517, -87.652491107, -87.66269195, -87.761233398, -87.626532173, -87.787522848, -87.695032866, -87.61406434, -87.654987667, -87.641131698, -87.585645433, -87.628491342, -87.627688599, -87.713340244, -87.655662965, -87.638560993, -87.763285108, -87.660126814, -87.589966186, -87.657089765, -87.665847907, -87.629904979, -87.648612493, -87.576941433, -87.725601735, -87.765880756, -87.57355192, -87.629168941, -87.688320563, -87.639628321, -87.663144179, -87.679652922, -87.680602833, -87.640888264, -87.587862886, -87.715502632, -87.724623088, -87.668894176, -87.640862796, -87.647198103, -87.666422486, -87.629450396, -87.668918026, -87.663089637, -87.656982534, -87.664034506, -87.63931246, -87.646620646, -87.650622101, -87.890619509, -87.741338682, -87.76899404, -87.619165105, -87.653580577, -87.69450809, -87.743441605, -87.59768703, -87.584391221, -87.640815604, -87.712783941, -87.604958685, -87.659992014, -87.624484053, -87.671559063, -87.748932564, -87.70234588, -87.689251423, -87.606554341, -87.653913374, -87.628345154, -87.65478194, -87.629365643, -87.626683155, -87.716080427, -87.702228253, -87.604006449, -87.655216366, -87.643770543, -87.656975687, -87.61672621, -87.615385513, -87.711395172, -87.650441678, -87.626413225, -87.709190774, -87.657692781, -87.619779248, -87.783984329, -87.639235498, -87.632267636, -87.586292974, -87.686516386, -87.634392628, -87.705558672, -87.767307661, -87.687393113, -87.724945467, -87.698652145, -87.620524823, -87.624125523, -87.66703966, -87.71421287, -87.65504587, -87.620808615, -87.604556978, -87.632865587, -87.707331169, -87.617681884, -87.621756659, -87.657701922, -87.663867778, -87.643906039, -87.721499025, -87.622417358, -87.634097494, -87.741772772, -87.627925741, -87.627560076, -87.689685077, -87.620794172, -87.600324481, -87.628704402, -87.649616689, -87.57646936, -87.765979125, -87.620560552, -87.631788635, -87.572039808, -87.729460332, -87.789463625, -87.64812943, -87.602624733, -87.6238217, -87.65511368, -87.635454463, -87.584412895, -87.58544391, -87.704469775, -87.694622835, -87.623311963, -87.745686519, -87.627516791, -87.634446911, -87.633144732, -87.606566877, -87.612890044, -87.746104545, -87.717682646, -87.628687773, -87.691787056, -87.690075979, -87.899335231, -87.624356274, -87.806941262, -87.697330182, -87.62353785, -87.608894322, -87.656859584, -87.624971297, -87.660994398, -87.586268228, -87.665496311, -87.715874022, -87.753629703, -87.662150113, -87.773706834, -87.76334948, -87.625785555, -87.785606186, -87.655056515, -87.62009309, -87.635309866, -87.70590492, -87.663460692, -87.640023065, -87.620920514, -87.614519556, -87.720260149, -87.627998616, -87.620471921, -87.62999581, -87.68891427, -87.681638768, -87.620691199, -87.630165513, -87.768017693, -87.698545833, -87.695141061, -87.552135344, -87.601533966, -87.732740144, -87.745573591, -87.638732821, -87.674618145, -87.762443285, -87.766676821, -87.729099546, -87.62208039, -87.55194424, -87.685269347, -87.7357763, -87.69837427, -87.765083909, -87.792066289, -87.633071176, -87.68366502, -87.631403865, -87.904122758, -87.663005702, -87.726353375, -87.605637491, -87.786051721, -87.656682274, -87.614977963, -87.605364858, -87.66292886, -87.643126381, -87.641003973, -87.616063534, -87.626752323, -87.742742299, -87.552581097, -87.719449481, -87.662241448, -87.627270627, -87.765089988, -87.596150779, -87.644322264, -87.670206562, -87.627758082, -87.568145845, -87.661899888, -87.724754706, -87.699311719, -87.620922418, -87.681328162, -87.608305812, -87.624904486, -87.631176812, -87.566499462, -87.6290881, -87.655317304, -87.644027249, -87.587441769, -87.663661519, -87.684213423, -87.65828143, -87.606920408, -87.632992969, -87.658300072, -87.695786038, -87.724478132, -87.76703474, -87.666764317, -87.629919733, -87.667720488, -87.618196037, -87.625020864, -87.713169339, -87.663250604, -87.758289677, -87.69486863, -87.608414956, -87.604728989, -87.58650411, -87.716854733, -87.645313581, -87.683470834, -87.728520584, -87.654300584, -87.661346081, -87.631233035, -87.707460248, -87.756452662, -87.664939363, -87.726830225, -87.60403305, -87.617721411, -87.697671823, -87.714344716, -87.562925787, -87.661380334, -87.70041219, -87.687415476, -87.649209628, -87.633102775, -87.708829703, -87.628444963, -87.705004143, -87.743235922, -87.751219421, -87.637527948, -87.629433662, -87.706298949, -87.651839165, -87.599937561, -87.618770371, -87.563830192, -87.622127226, -87.656660917, -87.689434991, -87.615768415, -87.664753261, -87.624096564, -87.629529005, -87.673617146, -87.68073427, -87.618278457, -87.76310227, -87.726568067, -87.645226923, -87.632569542, -87.731229119, -87.730408248, -87.703335272, -87.728667217, -87.628021143, -87.606143261, -87.662697489, -87.628153577, -87.615563898, -87.627075047, -87.836580014, -87.623318288, -87.703797654, -87.645397373, -87.724436322, -87.685315313, -87.663590843, -87.671366031, -87.729752505, -87.676949835, -87.846469859, -87.584690956, -87.598703055, -87.722952947, -87.668187079, -87.683530209, -87.655110993, -87.61843206, -87.664976619, -87.619394194, -87.60656135, -87.605912319, -87.652187364, -87.749684919, -87.607771565, -87.622436193, -87.757306728, -87.707307, -87.720214826, -87.77182211, -87.617020399, -87.707247537, -87.74537633, -87.576272815, -87.609536712, -87.591460936, -87.690186971, -87.604942686, -87.725964232, -87.719301353, -87.629939417, -87.651924995, -87.604680828, -87.703794846, -87.625514585, -87.708962817, -87.662730846, -87.63864165, -87.71275698, -87.746173905, -87.762346249, -87.627138636, -87.561127448, -87.630407807, -87.621678995, -87.661005031, -87.568335406, -87.65704844, -87.585505972, -87.718901728, -87.744861466, -87.61569704, -87.673521113, -87.744933466, -87.628082243, -87.618179506, -87.622148996, -87.65114825, -87.623917855, -87.636346911, -87.690227788, -87.634390852, -87.626251847, -87.68152935, -87.630898966, -87.65771014, -87.604634255, -87.620223934, -87.59934358, -87.55965482, -87.628829294, -87.579666374, -87.660969527, -87.637408128, -87.72192157, -87.558341882, -87.629995452, -87.558372185, -87.631374096, -87.628349059, -87.757534561, -87.664704019, -87.754988896, -87.636043721, -87.663560189, -87.577086035, -87.664702622, -87.549934016, -87.66903815, -87.647333315, -87.648534275, -87.655472861, -87.704486793, -87.740606259, -87.624068617, -87.654675056, -87.653841284, -87.673730413, -87.593008043, -87.605134262, -87.626069718, -87.627958744, -87.656700356, -87.63091811, -87.709224109, -87.619979608, -87.55956245, -87.618933678, -87.632339422, -87.70308407, -87.576474498, -87.882404127, -87.575471223, -87.624170849, -87.701088107, -87.634674198, -87.701900763, -87.613361976, -87.698965922, -87.627618559, -87.718855435, -87.733639652, -87.640835937, -87.559723393, -87.672262913, -87.682135713, -87.643302717, -87.653931188, -87.724091496, -87.579801505, -87.755443834, -87.646582863, -87.677386363, -87.653763616, -87.760474828, -87.673197782, -87.589144017, -87.747338823, -87.723774494, -87.585680998, -87.658045926, -87.674712257, -87.606385112, -87.718335376, -87.57694609, -87.61958096, -87.620133488, -87.643882805, -87.659671374, -87.66525544, -87.687517615, -87.563417608, -87.754026441, -87.610791873, -87.6642029, -87.635038395, -87.619328659, -87.564815996, -87.748331787, -87.767222504, -87.692755379, -87.723944549, -87.653821721, -87.645195004, -87.633490624, -87.742981092, -87.711356453, -87.728948432, -87.682871235, -87.6281167, -87.654790678, -87.627552452, -87.685012091, -87.684021912, -87.641832941, -87.673438518, -87.638916219, -87.632686147, -87.717414187, -87.653868654, -87.611570535, -87.725441164, -87.694646782, -87.746876909, -87.663469758, -87.763843161, -87.675338675, -87.643197739, -87.688508608, -87.698256423, -87.731731107, -87.679396533, -87.629033152, -87.626110978, -87.618164684, -87.635996453, -87.563224189, -87.690237586, -87.646879157, -87.716619992, -87.659931368, -87.684643895, -87.745899903, -87.562728003, -87.624765668, -87.658194834, -87.619214884, -87.737360606, -87.72727477, -87.797554615, -87.604847215, -87.65613622, -87.565407903, -87.633350017, -87.618221478, -87.70467367, -87.636526022, -87.632979778, -87.659315849, -87.649365938, -87.738421102, -87.645976688, -87.733835632, -87.712236304, -87.61679251, -87.620450694, -87.634671454, -87.626155308, -87.630270643, -87.633632427, -87.551237878, -87.64480037, -87.670887574, -87.726057418, -87.605520738, -87.704394994, -87.643349776, -87.622375476, -87.624890909, -87.65087832, -87.654110993, -87.599101334, -87.655327998, -87.62615082, -87.758753958, -87.621003344, -87.628849105, -87.727261298, -87.622745318, -87.619432999, -87.603287781, -87.623262756, -87.628219509, -87.624579657, -87.614478749, -87.684780097, -87.631888748, -87.602589491, -87.6439223, -87.659679691, -87.605950633, -87.670904385, -87.64245118, -87.684443267, -87.582057311, -87.650011483, -87.615885669, -87.674685821, -87.624932618, -87.748571238, -87.745792225, -87.64192187, -87.602151846, -87.614435596, -87.698860976, -87.746072695, -87.638676422, -87.632179351, -87.766482232, -87.597894925, -87.638841519, -87.617663323, -87.605007694, -87.724943845, -87.684601889, -87.703092193, -87.55456177, -87.605237166, -87.712364501, -87.736004831, -87.743418516, -87.774642998, -87.60364723, -87.601875318, -87.627860183, -87.65905678, -87.70560443, -87.664340305, -87.596008257, -87.736202402, -87.694266302, -87.634677382, -87.617725721, -87.636668714, -87.705963317, -87.622162249, -87.638924852, -87.707730613, -87.61669378, -87.607384952, -87.634166881, -87.657174571, -87.629359567, -87.634296325, -87.639335535, -87.763288073, -87.74675098, -87.625105604, -87.716965071, -87.626162366, -87.649432101, -87.658891391, -87.763214719, -87.566626344, -87.58548161, -87.598471599, -87.604322622, -87.656975296, -87.68867896, -87.572654511, -87.659624422, -87.771204147, -87.640555606, -87.748911462, -87.703205068, -87.594707324, -87.662533116, -87.603851467, -87.724108549, -87.846468041, -87.602741498, -87.744521435, -87.589121997, -87.641006667, -87.606108761, -87.745111964, -87.652309344, -87.6087643, -87.535974085, -87.722438871, -87.707130873, -87.620860102, -87.643868422, -87.623514952, -87.624263706, -87.636978269, -87.552538628, -87.596277178, -87.552860394, -87.642195568, -87.706100347, -87.690652359, -87.668560171, -87.641913321, -87.643399403, -87.71766176, -87.726431415, -87.63696315, -87.660590081, -87.545827764, -87.669964736, -87.725041634, -87.636758638, -87.708484611, -87.712851879, -87.554118677, -87.660064278, -87.670094384, -87.662732163, -87.627458476, -87.762537358, -87.748894125, -87.627222812, -87.632842923, -87.720170442, -87.629391306, -87.683808852, -87.634420924, -87.589191963, -87.625821329, -87.621589582, -87.644801107, -87.549461987, -87.64767983, -87.63693686, -87.62240731, -87.653311573, -87.683942092, -87.761594059, -87.723572168, -87.725750205, -87.644448488, -87.631760814, -87.755832889, -87.562686166, -87.638849697, -87.632613576, -87.655431953, -87.634022523, -87.639304571, -87.716784566, -87.617733588, -87.603907696, -87.708057934, -87.627981752, -87.690664522, -87.640017989, -87.619472488, -87.618472426, -87.561511321, -87.644584501, -87.613841024, -87.659435509, -87.617736187, -87.620598031, -87.624701342, -87.622769196, -87.659848302, -87.588056142, -87.658586238, -87.623745794, -87.664197479, -87.708407828, -87.83911785, -87.651162974, -87.628752556, -87.586108987, -87.619228088, -87.689930306, -87.625143469, -87.64007146, -87.633378182, -87.617855783, -87.632884581, -87.688269091, -87.626649614, -87.627343939, -87.75708711, -87.70453554, -87.668314701, -87.768194131, -87.623748793, -87.710761053, -87.649345507, -87.618640688, -87.659088972, -87.600271986, -87.627985817, -87.629103359, -87.725621359, -87.655342514, -87.775378157, -87.614547398, -87.624551258, -87.702391276, -87.76417995, -87.627701705, -87.707875716, -87.660457782, -87.62779438, -87.590788058, -87.686513346, -87.62704405, -87.66884662, -87.554061838, -87.621546109, -87.738227419, -87.614960789, -87.72069769, -87.725027144, -87.627252089, -87.76821448, -87.611035696, -87.689215828, -87.628597294, -87.56137777, -87.615343355, -87.591033336, -87.63175265, -87.748644193, -87.650142607, -87.679074821, -87.666436575, -87.73354419, -87.726623245, -87.656913808, -87.668997488, -87.627189408, -87.626387093, -87.604486948, -87.644863603, -87.713975828, -87.625314164, -87.752740241, -87.587624299, -87.646266397, -87.745933297, -87.647175913, -87.751179331, -87.582816839, -87.583848295, -87.637755959, -87.764894125, -87.656618405, -87.702399611, -87.70315393, -87.570808838, -87.6971543, -87.771810281, -87.668384208, -87.650918236, -87.637001425, -87.710742689, -87.767481572, -87.662840357, -87.694485803, -87.58505475, -87.677752298, -87.666258728, -87.631705393, -87.634289354, -87.631250927, -87.664719234, -87.634201201, -87.62599014, -87.682478942, -87.56390413, -87.625823165, -87.666016839, -87.657522554, -87.62413639, -87.653627921, -87.688661831, -87.631931184, -91.686565684, -87.564520335, -87.661297945, -87.638591667, -87.576272783, -87.695498927, -87.562727773, -87.619443526, -87.621542622, -87.666136197, -87.580621746, -87.672880906, -87.613018533, -87.651080731, -87.7648888, -87.692091435, -87.687650179, -87.621459125, -87.711751183, -87.560754143, -87.618684697, -87.653205626, -87.633713529, -87.605880167, -87.624356147, -87.699374632, -87.592138525, -87.777269865, -87.727190905, -87.740958098, -87.659053795, -87.719059064, -87.632166244, -87.697093121, -87.551205466, -87.653525166, -87.745427795, -87.681176287, -87.725474038, -87.551824707, -87.710418378, -87.720348395, -87.723427962, -87.625925, -87.716115753, -87.684074304, -87.661873779, -87.740514226, -87.620546628, -87.68639517, -87.623595224, -87.626203285, -87.667995263, -87.666880865, -87.621198838, -87.62002027, -87.624384106, -87.628801359, -87.586237993, -87.652384624, -87.622361533, -87.602624951, -87.632282365, -87.723714312, -87.608196828, -87.663684347, -87.638551885, -87.707193016, -87.628286589, -87.739199887, -87.627034305, -87.615649592, -87.669015012, -87.710642788, -87.68396521, -87.642789017, -87.674816769, -87.614445908, -87.585114125, -87.632873247, -87.73420392, -87.688515527, -87.634168963, -87.761752861, -87.714649091, -87.634136763, -87.62424085, -87.629756746, -87.617637943, -87.704977986, -87.658933611, -87.677653464, -87.635619998, -87.619812122, -87.622454163, -87.742277863, -87.627084778, -87.630666333, -87.593806252, -87.70949656, -87.840319644, -87.622346444, -87.705483628, -87.725321944, -87.674442028, -87.651863802, -87.640188069, -87.654935349, -87.704017656, -87.65195519, -87.636771693, -87.712505525, -87.658318065, -87.620580034, -87.688801432, -87.656188319, -87.621464432, -87.644264537, -87.630554342, -87.760726779, -87.661000678, -87.626168646, -87.632455702, -87.606084723, -87.678815744, -87.566478603, -87.663954978, -87.774881667, -87.632089801, -87.554639013, -87.638838917, -87.641710641, -87.625222661, -87.73191358, -87.711133375, -87.624413274, -87.628046859, -87.696401213, -87.741531177, -87.736351587, -87.83662354, -87.623781123, -87.755483038, -87.554055126, -87.717964416, -87.618369729, -87.708672836, -87.582519409, -87.657482838, -87.725683551, -87.666205668, -87.607256009, -87.565175308, -87.620106677, -87.703117482, -87.637192135, -87.726174308, -87.562657533, -87.672920073, -87.64452317, -87.626233272, -87.647690125, -87.655010442, -87.653455761, -87.661873492, -87.633919718, -87.704277465, -87.657820148, -87.713208208, -87.665062403, -87.620691382, -87.764964695, -87.60451692, -87.646360506, -87.667554656, -87.716547025, -87.631972713, -87.60595147, -87.723266186, -87.664979164, -87.66382789, -87.712203782, -87.667801443, -87.654802831, -87.740381959, -87.622121892, -87.62748798, -87.642645932, -87.658865072, -87.683816334, -87.641726854, -87.627847897, -87.629408248, -87.731082337, -87.675365909, -87.628341654, -87.644730213, -87.620832396, -87.576838856, -87.719180478, -87.668201247, -87.634297122, -87.618206966, -87.763276458, -87.629209346, -87.671904874, -87.631033159, -87.59631384, -87.643233311, -87.703917769, -87.605114755, -87.632311118, -87.773984044, -87.70768653, -87.664101191, -87.785553657, -87.566538409, -87.631482564, -87.745560622, -87.613857873, -87.621013915, -87.728571616, -87.640067886, -87.675273397, -87.756416633, -87.604873764, -87.630568743, -87.729191411, -87.626991263, -87.577036792, -87.636813954, -87.737116292, -87.585882075, -87.684858125, -87.72727224, -87.620005983, -87.642302645, -87.678366829, -87.646765255, -87.623925611, -87.726148375, -87.63430827, -87.655323262, -87.662568066, -87.713963181, -87.728850109, -87.617946617, -87.722521111, -87.694647718, -87.703233008, -87.663468026, -87.605955856, -87.642588988, -87.699561823, -87.624224612, -87.615880848, -87.619047858, -87.706157436, -87.618139193, -87.672387519, -87.715063469, -87.606511089, -87.764025029, -87.610864733, -87.637231984, -87.610352872, -87.647148068, -87.651054693, -87.617470765, -87.733025085, -87.564478225, -87.615568965, -87.659936276, -87.72433908, -87.683228721, -87.697459889, -87.702260375, -87.597226297, -87.657643177, -87.724388981, -87.718642232, -87.615851173, -87.615915353, -87.623823775, -87.550351535, -87.659690327, -87.597895771, -87.693016796, -87.578982056, -87.765830579, -87.628160433, -87.630203077, -87.699944941, -87.550491518, -87.616977126, -87.623977927, -87.74525413, -87.651539483, -87.755651544, -87.565117456, -87.583554214, -87.634591587, -87.617178654, -87.723124109, -87.746113289, -87.677409143, -87.67488021, -87.710894506, -87.685019955, -87.637079662, -87.67423383, -87.663460492, -87.721266986, -87.615475738, -87.717436972, -87.663873198, -87.57148207, -87.625215429, -87.841156435, -87.695279811, -87.551288344, -87.605125836, -87.662465929, -87.653199102, -87.621500665, -87.565080452, -87.691560322, -87.623786349, -87.634416245, -87.624377884, -87.710401471, -87.697717952, -87.752069147, -87.647905229, -87.746659991, -87.662566142, -87.667537182, -87.640696598, -87.771888909, -87.764962093, -87.746604326, -87.644297045, -87.635683921, -87.748419773, -87.663288919, -87.659225989, -87.621661324, -87.718974049, -87.680856265, -87.661054978, -87.612868333, -87.669176428, -87.726398891, -87.621674516, -87.76660788, -87.635184465, -87.736281864, -87.626992649, -87.708216117, -87.654301459, -87.641959693, -87.717683015, -87.582573441, -87.839658835, -87.664250148, -87.653106106, -87.640520462, -87.625628157, -87.698916468, -87.695127279, -87.724169003, -87.620670248, -87.648528893, -87.711501488, -87.698374433, -87.70920605, -87.755401618, -87.604913162, -87.628393146, -87.647618185, -87.620206266, -87.72384912, -87.611804821, -87.650198077, -87.756894211, -87.697193006, -87.681323493, -87.723408371, -87.608060119, -87.604600275, -87.609865368, -87.702980719, -87.634291664, -87.624846791, -87.618265505, -87.69007432, -87.626680112, -87.63654578, -87.74756329, -87.662340099, -87.723686253, -87.663516805, -87.615399623, -87.622568135, -87.643057853, -87.565047114, -87.613975119, -87.575527839, -87.657854427, -87.659797776, -87.592519489, -87.714264266, -87.722756805, -87.686497178, -87.633242486, -87.723294914, -87.552890447, -87.627915204, -87.64013022, -87.749064412, -87.631154519, -87.764584482, -87.64201078, -87.765958681, -87.622774469, -87.654782621, -87.601263259, -87.623047109, -87.684605927, -87.662179772, -87.628290698, -87.686073411, -87.751556978, -87.677422819, -87.641606807, -87.567088206, -87.657205404, -87.63930945, -87.733902763, -87.623986286, -87.649362967, -87.674750648, -87.621393611, -87.629598125, -87.650856378, -87.62814321, -87.662891098, -87.705343887, -87.590193647, -87.642365396, -87.763276799, -87.632025815, -87.585766931, -87.693185122, -87.626044379, -87.736312283, -87.573930201, -87.72700804, -87.745761689, -87.679365506, -87.653819694, -87.705602493, -87.652360831, -87.695096188, -87.661839303, -87.647934597, -87.649546279, -87.727590376, -87.725409853, -87.667012497, -87.629365941, -87.56386716, -87.56382127, -87.748869385, -87.634774508, -87.63413935, -87.677383251, -87.611625977, -87.623019008, -87.66482899, -87.64877819, -87.703437543, -87.614896187, -87.718892563, -87.693474202, -87.641824107, -87.655565552, -87.722570475, -87.713670197, -87.683554536, -87.63062942, -87.67029509, -87.765347251, -87.678492886, -87.649344776, -87.667877617, -87.63148948, -87.661855469, -87.621552652, -87.701950642, -87.772304964, -87.613969818, -87.627797026, -87.636780157, -87.5490632, -87.726396631, -87.654339768, -87.674488437, -87.787806556, -87.632145515, -87.708619469, -87.634218691, -87.67649739, -87.627298109, -87.593011267, -87.766514067, -87.642228591, -87.633156819, -87.620817871, -87.647508582, -87.559654632, -87.663087144, -87.685149193, -87.719985296, -87.563505555, -87.721027537, -87.578990155, -87.715725607, -87.701627875, -87.637623404, -87.747209193, -87.627929824, -87.730722361, -87.615922804, -87.632133928, -87.650385064, -87.605955453, -87.611887103, -87.743174845, -87.678232016, -87.697511683, -87.746147308, -87.62233006, -87.664247652, -87.605885396, -87.74328289, -87.771670424, -87.724082848, -87.76654056, -87.764808046, -87.624991059, -87.624552898, -87.722118889, -87.657993425, -87.727593069, -87.635171022, -87.566256674, -87.786312492, -87.622649219, -87.612285564, -87.681051227, -87.617627512, -87.674729636, -87.836589041, -87.625115462, -87.625489799, -87.654122097, -87.731717071, -87.663276191, -87.714820496, -87.717965782, -87.65970977, -87.545284948, -87.725042997, -87.721973302, -87.653564811, -87.75561931, -87.654963918, -87.639554589, -87.669633576, -87.624100509, -87.632468271, -87.639614884, -87.662424292, -87.635103784, -87.625793875, -87.746194922, -87.623286482, -87.643985382, -87.658257752, -87.727628041, -87.709452068, -87.626203588, -87.603624629, -87.568278663, -87.717095148, -87.654989539, -87.61916287, -87.589657198, -87.745026674, -87.684507864, -87.656984681, -87.667594837, -87.614159613, -87.632543289, -87.765347056, -87.629161789, -87.610090986, -87.680438363, -87.724213803, -87.715194702, -87.611465177, -87.668264445, -87.696214119, -87.653906431, -87.705537043, -87.614590067, -87.711794487, -87.58769156, -87.648117094, -87.621021833, -87.61327504, -87.603727666, -87.748890135, -87.583871749, -87.707147749, -87.624276332, -87.638349075, -87.731062705, -87.715304747, -87.685041334, -87.666897965, -87.628828854, -87.640763574, -87.628548144, -87.727902167, -87.657928425, -87.687919626, -87.73687555, -87.722467073, -87.623456403, -87.648875415, -87.62413407, -87.693193691, -87.54578418, -87.635313686, -87.66424243, -87.653601485, -87.657883624, -87.620840409, -87.644872172, -87.625902397, -87.760644255, -87.648687002, -87.697288509, -87.667747448, -87.645841619, -87.604505041, -87.691153739, -87.661193702, -87.641414048, -87.664107154, -87.597061964, -87.568660742, -87.617497067, -87.724822014, -87.697924887, -87.765487839, -87.663132128, -87.751255395, -87.636280076, -87.713056469, -87.654060543, -87.631340358, -87.605417347, -87.613190628, -87.6834133, -87.629994265, -87.647150367, -87.639268759, -87.80543826, -87.682927245, -87.709132611, -87.631826613, -87.669410137, -87.585560041, -87.621046509, -87.645389036, -87.623198545, -87.723650826, -87.800760135, -87.66785807, -87.628074015, -87.615747505, -87.623711271, -87.736054156, -87.555472437, -87.667848083, -87.626317482, -87.617232658, -87.76064626, -87.6182857, -87.737521099, -87.64413477, -87.764920978, -87.618567334, -87.596173259, -87.735196552, -87.639062616, -87.627475027, -87.683668326, -87.631432802, -87.632125441, -87.603963101, -87.644782411, -87.717562519, -87.601263048, -87.706819251, -87.747427476, -87.656592266, -87.730377386, -87.58425861, -87.733572569, -87.668190845, -87.693384732, -87.726700354, -87.813008283, -87.738347838, -87.768294247, -87.641900009, -87.745551103, -87.670157774, -87.685314897, -87.646777915, -87.654770303, -87.658192271, -87.626539467, -87.654815176, -87.63405559, -87.633639541, -87.630900966, -87.752027675, -87.735854874, -87.629290122, -87.677444645, -87.634789274, -87.597703677, -87.698250977, -87.535283936, -87.624229924, -87.723827836, -87.730368538, -87.717298504, -87.72620879, -87.703181081, -87.746805637, -87.693898477, -87.707501835, -87.613364699, -87.763279227, -87.683432779, -87.622880843, -87.63987705, -87.648031778, -87.724031146, -87.683828168, -87.601099375, -87.7251516, -87.575339397, -87.707842691, -87.605996752, -87.687949774, -87.64846533, -87.639913366, -87.649333564, -87.69722762, -87.645011568, -87.57632241, -87.692918534, -87.640098183, -87.590555884, -87.644410632, -87.747491584, -87.562717776, -87.565145333, -87.765795529, -87.673665584, -87.585060362, -87.683279663, -87.760901352, -87.629465296, -87.683625816, -87.663038277, -87.697212498, -87.732393134, -87.712355992, -87.730885744, -87.666335779, -87.642805728, -87.71189003, -87.707392238, -87.572815843, -87.66148997, -87.680697233, -87.668667203, -87.655322651, -87.573892082, -87.738493688, -87.658501324, -87.606036193, -87.646153643, -87.758567201, -87.627270111, -87.661345692, -87.575997062, -87.702868881, -87.612058594, -87.658571406, -87.692413979, -87.630576503, -87.68337861, -87.741891416, -87.556492213, -87.65963743, -87.584412494, -87.636527202, -87.744282439, -87.647282257, -87.687370839, -87.581812836, -87.634053068, -87.596892617, -87.733413002, -87.709152299, -87.65617875, -87.666508943, -87.633937881, -87.630396032, -87.726864226, -87.720642095, -87.606595385, -87.663825429, -87.62434741, -87.766800977, -87.731360167, -87.586293688, -87.773375269, -87.706472369, -87.642761358, -87.600611049, -87.684578085, -87.631396045, -87.728909437, -87.696641335, -87.571479508, -87.67971859, -87.688581334, -87.719452496, -87.683521522, -87.604432386, -87.640675614, -87.629720655, -87.586596725, -87.623301059, -87.705240064, -87.561226467, -87.726311713, -87.664352579, -87.658318789, -87.695604526, -87.717622489, -87.664244955, -87.709088822, -87.726016035, -87.629950194, -87.676331372, -87.671081839, -87.744897116, -87.741996341, -87.613763088, -87.755612897, -87.586275721, -87.640885421, -87.721605386, -87.621721841, -87.628972081, -87.619869654, -87.711051839, -87.685328677, -87.653587393, -87.679083567, -87.596808838, -87.631367455, -87.639289833, -87.762582634, -87.705335883, -87.62055566, -87.623218373, -87.65353015, -87.557756078, -87.670441113, -87.657839028, -87.683994549, -87.606434385, -87.603411734, -87.621828417, -87.640794522, -87.621663126, -87.655833034, -87.58617869, -87.750413773, -87.676972155, -87.603989513, -87.664650661, -87.754026367, -87.620687893, -87.695524775, -87.564741105, -87.664239363, -87.680072014, -87.586052837, -87.63905866, -87.648241284, -87.626168624, -87.776018796, -87.62305924, -87.664056445, -87.625487641, -87.749218092, -87.606868273, -87.612154585, -87.65022937, -87.636042402, -87.605564121, -87.716022042, -87.781870199, -87.584732228, -87.624185113, -87.657759302, -87.596755181, -87.653132052, -87.755203594, -87.691281983, -87.648626876, -87.672457312, -87.606719667, -87.627917936, -87.613280429, -87.58501858, -87.566498814, -87.660155617, -87.606583156, -87.622979997, -87.586270811, -87.633888347, -87.625100948, -87.605994141, -87.624599541, -87.624778076, -87.638742433, -87.657874472, -87.648106932, -87.673186151, -87.744012355, -87.741110208, -87.766124092, -87.67371278, -87.74301085, -87.605433227, -87.653779875, -87.697278585, -87.726408427, -87.64295433, -87.605217567, -87.614711765, -87.752636861, -87.626766976, -87.64033523, -87.643112572, -87.626834633, -87.626222, -87.726899566, -87.700242574, -87.678407267, -87.588018999, -87.682111024, -87.58129902, -87.757469412, -87.604481355, -87.553777728, -87.64708709, -87.677447594, -87.630006701, -87.641542722, -87.652323905, -87.619103181, -87.560576484, -87.66294264, -87.670585564, -87.601209921, -87.622331081, -87.622637403, -87.643968122, -87.728944145, -87.625299815, -87.641625677, -87.655685196, -87.741318814, -87.616889375, -87.706746857, -87.722432928, -87.63189334, -87.637543608, -87.585796054, -87.549900201, -87.668927703, -87.650553579, -87.650603352, -87.64218164, -87.721785463, -87.661093881, -87.696041325, -87.745629701, -87.766203961, -87.731556033, -87.595483806, -87.608866374, -87.65416803, -87.626265771, -87.620278643, -87.695829812, -87.61910591, -87.631425965, -87.655208186, -87.712794514, -87.665505285, -87.606473158, -87.646549464, -87.712080245, -87.628340053, -87.657044306, -87.685161952, -87.550179329, -87.726365155, -87.614612112, -87.656312031, -87.602469089, -87.625130255, -87.674662315, -87.58650401, -87.627609167, -87.670131443, -87.628727499, -87.638501961, -87.621025232, -87.716095047, -87.606873919, -87.604363507, -87.655497959, -87.61032506, -87.648592978, -87.709430607, -87.673072164, -87.632702709, -87.670505657, -87.664621403, -87.723198732, -87.680742064, -87.722664867, -87.731722451, -87.608601727, -87.592570988, -87.591117851, -87.72714355, -87.656597758, -87.669480927, -87.632386952, -87.655409564, -87.690535632, -87.713949511, -87.731212135, -87.761630358, -87.805911332, -87.645099984, -87.550635931, -87.605795029, -87.623461757, -87.617139647, -87.643098749, -87.634623176, -87.617323885, -87.55812601, -87.645749253, -87.721784049, -87.661060061, -87.61265777, -87.627995064, -87.685258451, -87.621724757, -87.721829061, -87.629759392, -87.669489133, -87.628594922, -87.714135759, -87.612439993, -87.761627787, -87.630600457, -87.665874544, -87.585429397, -87.771693958, -87.566914357, -87.565154461, -87.725146911, -87.615563714, -87.676890454, -87.692313579, -87.622244109, -87.72460935, -87.772094898, -87.655432099, -87.623263115, -87.590885285, -87.627930066, -87.673147017, -87.658896113, -87.6388974, -87.620827806, -87.627557257, -87.649717805, -87.654550627, -87.624856894, -87.704418782, -87.630045663, -87.705654876, -87.760545114, -87.632467972, -87.620471366, -87.606037247, -87.649158884, -87.765582036, -87.653596936, -87.72565211, -87.626423821, -87.623791625, -87.576232702, -87.629664215, -87.627002693, -87.554146165, -87.700414126, -87.763410964, -87.746431558, -87.735961599, -87.630550934, -87.737783136, -87.712849684, -87.624308341, -87.66063661, -87.627808072, -87.566364189, -87.720098641, -87.602694582, -87.661178143, -87.632779182, -87.566252678, -87.637588738, -87.659853167, -87.615560874, -87.664865641, -87.666219555, -87.649409369, -87.752974602, -87.621776719, -87.653540556, -87.75320881, -87.649978542, -87.70579017, -87.74386414, -87.560005138, -87.656261348, -87.660428707, -87.636948032, -87.666526442, -87.763282338, -87.613756011, -87.746525605, -87.6598884, -87.651018015, -87.62145895, -87.628998255, -87.726601533, -87.761077636, -87.657162192, -87.569966992, -87.676277805, -87.692066658, -87.772789486, -87.632355065, -87.620901922, -87.672249127, -87.644548217, -87.712876373, -87.727275004, -87.721444549, -87.591117282, -87.658479822, -87.683772589, -87.624514982, -87.633860272, -87.70200627, -87.65676102, -87.641318295, -87.576471929, -87.723080029, -87.61729636, -87.655495503, -87.716205977, -87.624432552, -87.634031756, -87.65366146, -87.625740234, -87.739665593, -87.728772149, -87.696841493, -87.704854042, -87.639645375, -87.717078645, -87.637695331, -87.640858621, -87.584047451, -87.658097002, -87.644416473, -87.655501171, -87.610416098, -87.746897266, -87.725192528, -87.655803289, -87.717479393, -87.694469854, -87.763135333, -87.614891712, -87.695069626, -87.666968639, -87.665946948, -87.615275297, -87.644541548, -87.617498271, -87.842123304, -87.601834735, -87.684365088, -87.650025065, -87.668187508, -87.626309934, -87.66019784, -87.613699222, -87.595841543, -87.719525974, -87.721671014, -87.664250696, -87.64397615, -87.578984755, -87.62537228, -87.726797963, -87.586322042, -87.716865704, -87.699370763, -87.709554828, -87.673778459, -87.632658693, -87.664527276, -87.711230943, -87.605761772, -87.657969065, -87.626192049, -87.613273996, -87.768599327, -87.641489077, -87.693718132, -87.686340752, -87.76464733, -87.6861979, -87.723243221, -87.626197575, -87.717317244, -87.792414622, -87.688270928, -87.683225997, -87.749867783, -87.744921277, -87.74561855, -87.620775574, -87.609612588, -87.701889563, -87.615568751, -87.704850674, -87.71806122, -87.707199231, -87.765671149, -87.696440558, -87.741302702, -87.585462773, -87.751432105, -87.684849239, -87.632007113, -87.632355275, -87.769086168, -87.685473571, -87.613342648, -87.65490716, -87.625554948, -87.654813009, -87.618792215, -87.625884861, -87.726745508, -87.711442061, -87.731492186, -87.622804979, -87.657939671, -87.655043562, -87.75075343, -87.660853065, -87.665852691, -87.71791397, -87.628055281, -87.587894753, -87.606467715, -87.637634891, -87.667212152, -87.657745237, -87.649298827, -87.745509336, -87.749677146, -87.719095426, -87.669628118, -87.745545036, -87.637517763, -87.743343717, -87.657368059, -87.711475408, -87.661001082, -87.701005851, -87.708953234, -87.660480953, -87.629323117, -87.635193673, -87.652855748, -87.648295571, -87.628157005, -87.727271903, -87.720110283, -87.605224518, -87.554102046, -87.757679269, -87.604335461, -87.649245116, -87.623628162, -87.620121895, -87.714238568, -87.649154806, -87.601380078, -87.593120705, -87.548397775, -87.846467142, -87.647505137, -87.771384873, -87.65709614, -87.629229381, -87.60392204, -87.732312933, -87.666482703, -87.62939674, -87.62598437, -87.586294455, -87.628305374, -87.720925992, -87.642045876, -87.61012406, -87.628869539, -87.613197481, -87.551332583, -87.573246075, -87.637522586, -87.571544262, -87.620548131, -87.572315031, -87.745754666, -87.722060175, -87.639761826, -87.766271177, -87.599357934, -87.710417899, -87.753543987, -87.658373656, -87.625650736, -87.660972253, -87.654078463, -87.617147205, -87.648536848, -87.649814857, -87.633314847, -87.627904784, -87.65083157, -87.697047165, -87.656853651, -87.684115567, -87.595806104, -87.723702988, -87.640448949, -87.606344711, -87.723822, -87.653509519, -87.669922369, -87.656581101, -87.566441838, -87.754095623, -87.563113279, -87.709650307, -87.619925551, -87.62229526, -87.717685792, -87.624428666, -87.722294037, -87.629162044, -87.583690122, -87.635836483, -87.679740809, -87.763365161, -87.711052714, -87.711339503, -87.622954198, -87.665009243, -87.635213191, -87.771385162, -87.640250708, -87.68277849, -87.562688944, -87.669102656, -87.613148415, -87.545784415, -87.716895493, -87.711929688, -87.746574166, -87.662381948, -87.575261338, -87.67727301, -87.720642462, -87.534076536, -87.721236259, -87.654108023, -87.746070116, -87.58583056, -87.556332011, -87.63806697, -87.727274434, -87.659655286, -87.703075093, -87.684526408, -87.617022328, -87.67976015, -87.61494361, -87.678875923, -87.753460758, -87.576313866, -87.692350085, -87.634320718, -87.549268415, -87.656801867, -87.644435915, -87.705228282, -87.674324659, -87.585212192, -87.719458499, -87.643028117, -87.688448935, -87.706228705, -87.657661545, -87.649658898, -87.615568537, -87.708892578, -87.619828901, -87.747117979, -87.643240599, -87.69914356, -87.705343247, -87.608301602, -87.704772409, -87.705136035, -87.577280883, -87.687239742, -87.687527244, -87.70803582, -87.644473107, -87.542472012, -87.605958065, -87.673277938, -87.654662395, -87.628455651, -87.696178334, -87.624144053, -87.66585289, -87.659540049, -87.628291119, -87.651688112, -87.638206774, -87.625074428, -87.650729069, -87.632354229, -87.694102327, -87.624279399, -87.718900528, -87.612645497, -87.585891235, -87.75494476, -87.601228243, -87.649445039, -87.736182698, -87.706174768, -87.624025622, -87.630259516, -87.643545951, -87.70954025, -87.721389788, -87.745852958, -87.717365709, -87.666172559, -87.710884842, -87.628783073, -87.643756572, -87.630103892, -87.622819173, -87.605867915, -87.75166448, -87.688828331, -87.666983746, -87.627800699, -87.651670668, -87.764939346, -87.62773362, -87.751281527, -87.627202052, -87.745773311, -87.663126037, -87.615599158, -87.77366461, -87.576054836, -87.673030483, -87.651402671, -87.690528719, -87.741712462, -87.559222587, -87.721434673, -87.573940462, -87.636803841, -87.742731337, -87.544274901, -87.642904147, -87.713734067, -87.755274922, -87.600156778, -87.626668478, -87.624275756, -87.763523806, -87.612187129, -87.640451538, -87.766605275, -87.723556827, -87.683866331, -87.664341555, -87.671911768, -87.703196029, -87.554174373, -87.631231515, -87.756879522, -87.612493314, -87.714124026, -87.637541471, -87.628253084, -87.724782842, -87.717698178, -87.664090778, -87.602332155, -87.666871364, -87.616400807, -87.656905495, -87.627946266, -87.627820055, -87.713592319, -87.646305794, -87.561509844, -87.709784193, -87.74312593, -87.627798561, -87.63981361, -87.593041821, -87.703986513, -87.658819527, -87.631640804, -87.724437775, -87.726344642, -87.594962029, -87.76149836, -87.648226263, -87.651493806, -87.632413402, -87.553488733, -87.62704979, -87.746046383, -87.607702294, -87.626926379, -87.710418671, -87.612102642, -87.720049633, -87.632564987, -87.627939823, -87.681604302, -87.601695694, -87.628848381, -87.664345878, -87.627443675, -87.628575838, -87.65451385, -87.61911936, -87.698302683, -87.74794257, -87.568865843, -87.68810952, -87.745982614, -87.644772518, -87.633556985, -87.751505396, -87.677181158, -87.634695089, -87.648390992, -87.653832316, -87.664863565, -87.660446578, -87.750939203, -87.683921414, -87.647911383, -87.560742797, -87.642190243, -87.629933817, -87.655743334, -87.674437636, -87.636811728, -87.692796336, -87.693786537, -87.630135884, -87.662929863, -87.661221497, -87.655221829, -87.666209262, -87.702697421, -87.535280094, -87.6424413, -87.602325685, -87.764957714, -87.747354629, -87.629150979, -87.614854869, -87.766334891, -87.636904049, -87.653535714, -87.627438388, -87.662195751, -87.745927891, -87.642631393, -87.72355701, -87.645336203, -87.645583514, -87.689777521, -87.642959263, -87.712440675, -87.70360708, -87.634742921, -87.545820662, -87.654995436, -87.579797849, -87.721584549, -87.731685867, -87.675174895, -87.717734819, -87.766458235, -87.725939277, -87.621061391, -87.776483341, -87.650316375, -87.587271736, -87.664342569, -87.68312964, -87.686627405, -87.757033797, -87.755186179, -87.608377666, -87.677084446, -87.727007058, -87.60595567, -87.620621557, -87.584687735, -87.664728374, -87.630247996, -87.584002797, -87.645440819, -87.535283747, -87.618097079, -87.763879259, -87.689642668, -87.766332042, -87.885097567, -87.674184077, -87.641694439, -87.753895296, -87.627021129, -87.653677744, -87.666264958, -87.644683072, -87.65630006, -87.664437865, -87.647988403, -87.563154726, -87.615745896, -87.626289429, -87.631312304, -87.625922932, -87.613235784, -87.638093796, -87.71562282, -87.605788001, -87.632653865, -87.656591889, -87.761636064, -87.688366953, -87.626409097, -87.718950781, -87.700359595, -87.669379304, -87.604683641, -87.687857122, -87.633313023, -87.600839053, -87.619031541, -87.783357173, -87.665184141, -87.6155635, -87.626157171, -87.53597039, -87.674747204, -87.5848746, -87.619306201, -87.620069455, -87.794924093, -87.691694369, -87.600360737, -87.558237537, -87.675974898, -87.580887779, -87.642757034, -87.710532902, -87.632182489, -87.721990345, -87.646254251, -87.679696983, -87.690663515, -87.690736024, -87.763746728, -87.721612191, -87.615789456, -87.606773358, -87.638027585, -87.562624263, -87.770294412, -87.69521739, -87.770546219, -87.718102101, -87.749331743, -87.621727544, -87.637999874, -87.706919954, -87.627714909, -87.747047289, -87.62324655, -87.699605926, -87.719621079, -87.631807419, -87.650896405, -87.616777947, -87.605326291, -87.691214368, -87.727385537, -87.787488548, -87.686545515, -87.648910326, -87.560164545, -87.605112145, -87.726163929, -87.672097042, -87.593598258, -87.710592186, -87.750381613, -87.605564801, -87.67308633, -87.62772157, -87.591480454, -87.617490355, -87.611201716, -87.666085367, -87.616826728, -87.659808661, -87.701003946, -87.703138973, -87.635878846, -87.627675461, -87.649420997, -87.735464519, -87.640424984, -87.701473317, -87.73179249, -87.644613509, -87.661846328, -87.645195709, -87.744119215, -87.590997844, -87.651517456, -87.58365693, -87.633921684, -87.662942811, -87.767064116, -87.546615031, -87.626519016, -87.635961312, -87.614121283, -87.708731086, -87.73885249, -87.644902958, -87.650612577, -87.632181183, -87.70294803, -87.643100645, -87.746962481, -87.787165602, -87.764507548, -87.730014078, -87.636428384, -87.666888079, -87.634743877, -87.656850699, -87.709257484, -87.744165079, -87.596195666, -87.673594671, -87.648938479, -87.634808141, -87.644316629, -87.619260451, -87.721224863, -87.722598187, -87.706173442, -87.555161228, -87.747942191, -87.647274006, -87.639223526, -87.614647172, -87.627224029, -87.62664099, -87.806466288, -87.712381872, -87.725813061, -87.671487478, -87.623054656, -87.722176303, -87.765400451, -87.631523712, -87.725638467, -87.719931808, -87.65743376, -87.66592922, -87.713763476, -87.702006888, -87.657158382, -87.634262752, -87.650489142, -87.728142793, -87.643297231, -87.609650728, -87.711728299, -87.62340447, -87.649098615, -87.601656868, -87.704527184, -87.623887252, -87.625930316, -87.572671287, -87.596022926, -87.562686593, -87.648554994, -87.622118983, -87.622933681, -87.674316413, -87.726784885, -87.64987086, -87.744028854, -87.685520019, -87.638119181, -87.662484034, -87.632576028, -87.709463721, -87.72619208, -87.666742046, -87.637651332, -87.705515813, -87.728696242, -87.6454635, -87.657797212, -87.600973936, -87.658952119, -87.604512613, -87.560568865, -87.659768922, -87.664545411, -87.699571875, -87.640807804, -87.711574237, -87.715356764, -87.636827836, -87.565493151, -87.765329611, -87.632339962, -87.64556634, -87.661008365, -87.673208421, -87.588226431, -87.713607116, -87.658038469, -87.59013488, -87.75575519, -87.701512057, -87.634367274, -87.654301051, -87.721960292, -87.633177068, -87.771818798, -87.601375156, -87.747983503, -87.742794939, -87.694636659, -87.663245417, -87.620524929, -87.641807112, -87.723829326, -87.567493189, -87.655139299, -87.649566735, -87.709620261, -87.638699762, -87.668405616, -87.674817794, -87.618871535, -87.646100807, -87.603835415, -87.682921109, -87.722393601, -87.662998245, -87.576090212, -87.626221334, -87.758186188, -87.661601175, -87.684551821, -87.777110584, -87.631889929, -87.73095549, -87.589118634, -87.712308925, -87.768213948, -87.714438076, -87.624272204, -87.629410745, -87.663236494, -87.727408706, -87.728758861, -87.689797763, -87.736557282, -87.724647102, -87.60505473, -87.743581497, -87.658261552, -87.622476522, -87.626394792, -87.766549534, -87.724994244, -87.630462495, -87.665881802, -87.643165716, -87.63269443, -87.628339611, -87.556960404, -87.660997249, -87.708555894, -87.655328202, -87.699520105, -87.619800447, -87.770170439, -87.699714109, -87.680159235, -87.670727526, -87.59135947, -87.636388619, -87.653241686, -87.633614833, -87.693291067, -87.563900924, -87.707497627, -87.65999524, -87.72355794, -87.631849815, -87.683134989, -87.745225096, -87.672883168, -87.616683734, -87.627701434, -87.58775136, -87.736406709, -87.674720578, -87.606696541, -87.633795457, -87.634759184, -87.624192644, -87.619048127, -87.71536223, -87.619073616, -87.628501494, -87.625870527, -87.654560398, -87.60599831, -87.62434115, -87.629777247, -87.655800725, -87.663590235, -87.630352182, -87.619485678, -87.751457809, -87.709932648, -87.651037094, -87.630903677, -87.721449563, -87.701093842, -87.683100073, -87.629221649, -87.623784561, -87.713773382, -87.60275264, -87.625522419, -87.667702668, -87.627920479, -87.658739723, -87.739332063, -87.624377641, -87.620211441, -87.726278212, -87.637753417, -87.603761575, -87.726418662, -87.684713886, -87.568232183, -87.707791583, -87.629797523, -87.718344521, -87.614803635, -87.652192619, -87.78739692, -87.561279511, -87.693168198, -87.585053781, -87.653617159, -87.726571455, -87.620125605, -87.761740038, -87.63441848, -87.637420246, -87.576437708, -87.617487726, -87.639936767, -87.5510542, -87.662083482, -87.738697478, -87.685580175, -87.684902319, -87.699144174, -87.624283454, -87.700020957, -87.632720574, -87.675110943, -87.707585653, -87.668893737, -87.625628785, -87.668279031, -87.577835759, -87.704919592, -87.765577689, -87.734817871, -87.545782092, -87.623925743, -87.677319464, -87.634129641, -87.622652971, -87.535276291, -87.604478745, -87.726284971, -87.605771241, -87.654085821, -87.615146952, -87.669913344, -87.655550394, -87.709505896, -87.602582699, -87.709514547, -87.639244787, -87.643855503, -87.642024029, -87.717681095, -87.630563272, -87.658275881, -87.583697861, -87.606637175, -87.653941271, -87.664592486, -87.666209218, -87.551163198, -87.673186156, -87.707634031, -87.623111162, -87.774857276, -87.622677433, -87.63139377, -87.644631566, -87.886920464, -87.638296724, -87.682275281, -87.714093468, -87.721496324, -87.601687415, -87.583968081, -87.624355843, -87.663097148, -87.599098513, -87.628049777, -87.611693368, -87.656199698, -87.647852131, -87.641484982, -87.726983152, -87.566250124, -87.723783155, -87.608413399, -87.614359614, -87.692085955, -87.622345752, -87.631057336, -87.667597844, -87.642467932, -87.648999894, -87.605994327, -87.76586253], "marker": {"color": [13113, 9432, 6933, 4287, 3120, 3037, 2680, 2545, 2455, 2438, 2380, 2370, 2284, 2257, 2187, 2179, 2169, 2137, 2050, 2004, 1957, 1915, 1896, 1891, 1887, 1878, 1862, 1854, 1850, 1848, 1838, 1832, 1829, 1790, 1695, 1678, 1670, 1655, 1655, 1601, 1591, 1587, 1586, 1586, 1585, 1583, 1560, 1559, 1548, 1537, 1535, 1527, 1523, 1523, 1518, 1511, 1480, 1433, 1429, 1427, 1416, 1416, 1412, 1391, 1374, 1370, 1362, 1353, 1351, 1348, 1346, 1331, 1323, 1308, 1296, 1288, 1286, 1285, 1278, 1272, 1260, 1251, 1248, 1245, 1238, 1234, 1233, 1226, 1210, 1196, 1185, 1182, 1179, 1177, 1176, 1173, 1173, 1170, 1166, 1165, 1161, 1159, 1158, 1150, 1147, 1144, 1142, 1129, 1125, 1120, 1116, 1115, 1108, 1095, 1094, 1093, 1083, 1078, 1071, 1070, 1069, 1064, 1062, 1061, 1057, 1051, 1051, 1051, 1046, 1039, 1039, 1036, 1036, 1036, 1034, 1033, 1032, 1029, 1024, 1015, 1014, 1005, 1002, 999, 993, 993, 992, 983, 978, 974, 973, 972, 970, 969, 962, 960, 957, 944, 943, 941, 939, 938, 936, 935, 931, 925, 923, 919, 911, 910, 905, 901, 897, 892, 891, 889, 882, 882, 880, 880, 879, 876, 874, 871, 870, 870, 869, 868, 868, 867, 858, 858, 847, 847, 846, 845, 843, 837, 834, 832, 831, 831, 829, 827, 823, 822, 822, 818, 811, 807, 805, 804, 799, 796, 795, 792, 788, 788, 784, 781, 780, 778, 778, 778, 776, 773, 771, 770, 766, 761, 761, 761, 754, 753, 752, 752, 751, 751, 750, 750, 748, 747, 743, 742, 741, 740, 737, 737, 735, 735, 734, 733, 733, 731, 731, 730, 724, 724, 722, 721, 721, 720, 718, 716, 715, 713, 713, 712, 708, 707, 705, 704, 697, 697, 697, 691, 687, 685, 684, 683, 682, 682, 678, 674, 672, 672, 672, 670, 668, 668, 668, 666, 666, 666, 665, 665, 664, 663, 662, 661, 660, 660, 657, 655, 654, 652, 651, 649, 649, 648, 648, 647, 644, 643, 643, 642, 641, 641, 640, 637, 637, 637, 636, 634, 634, 633, 632, 629, 628, 628, 626, 626, 626, 626, 625, 625, 625, 625, 622, 621, 619, 619, 618, 618, 618, 617, 616, 615, 615, 614, 614, 611, 611, 610, 610, 607, 605, 604, 602, 601, 599, 598, 597, 597, 596, 596, 596, 595, 594, 592, 592, 591, 590, 589, 589, 589, 587, 587, 583, 583, 582, 581, 581, 580, 580, 580, 580, 579, 579, 578, 578, 577, 576, 576, 575, 571, 570, 569, 566, 566, 565, 564, 564, 561, 560, 559, 559, 558, 557, 556, 556, 555, 554, 554, 554, 554, 552, 552, 552, 551, 549, 549, 547, 547, 547, 546, 546, 546, 546, 545, 545, 544, 544, 544, 544, 543, 541, 541, 541, 540, 539, 537, 537, 537, 536, 536, 536, 535, 535, 535, 534, 533, 533, 533, 532, 531, 530, 530, 530, 530, 527, 526, 525, 525, 524, 524, 524, 523, 522, 522, 521, 520, 516, 515, 515, 514, 514, 514, 514, 513, 513, 513, 511, 511, 511, 510, 510, 509, 509, 508, 503, 503, 503, 502, 502, 502, 502, 501, 501, 501, 500, 499, 498, 497, 497, 496, 496, 493, 492, 492, 491, 491, 490, 488, 487, 487, 487, 485, 485, 484, 484, 483, 483, 482, 482, 482, 482, 480, 480, 480, 480, 479, 478, 478, 478, 475, 475, 474, 474, 474, 474, 471, 470, 470, 469, 469, 469, 467, 467, 467, 464, 464, 464, 463, 463, 463, 463, 462, 462, 460, 459, 459, 459, 458, 457, 457, 456, 456, 456, 456, 455, 455, 455, 454, 454, 454, 454, 453, 453, 452, 452, 451, 450, 450, 450, 450, 449, 449, 449, 448, 448, 448, 448, 446, 446, 446, 445, 445, 445, 443, 443, 442, 441, 440, 440, 440, 439, 438, 438, 438, 438, 437, 437, 437, 436, 436, 435, 435, 435, 435, 435, 435, 433, 433, 432, 431, 430, 430, 430, 429, 429, 429, 429, 428, 428, 428, 427, 426, 425, 425, 424, 424, 423, 421, 421, 420, 419, 419, 418, 418, 418, 418, 418, 417, 417, 416, 415, 415, 415, 415, 415, 415, 414, 414, 414, 414, 414, 413, 413, 413, 413, 413, 413, 412, 412, 411, 410, 410, 410, 409, 408, 408, 408, 407, 407, 406, 406, 406, 406, 405, 405, 405, 403, 403, 402, 402, 402, 401, 401, 401, 401, 400, 399, 399, 399, 399, 399, 398, 398, 397, 397, 397, 396, 396, 396, 396, 396, 395, 395, 395, 395, 394, 394, 394, 393, 393, 393, 392, 392, 392, 392, 392, 392, 392, 392, 392, 391, 390, 390, 390, 389, 389, 389, 389, 389, 388, 388, 388, 388, 387, 387, 387, 386, 386, 386, 385, 385, 385, 385, 384, 384, 383, 383, 382, 382, 381, 381, 381, 380, 379, 379, 379, 379, 379, 379, 378, 378, 378, 378, 376, 376, 376, 376, 375, 375, 375, 375, 375, 374, 374, 374, 374, 373, 371, 371, 371, 371, 371, 371, 370, 370, 369, 369, 369, 369, 368, 368, 368, 368, 368, 368, 367, 366, 366, 366, 365, 365, 365, 365, 364, 364, 364, 363, 363, 363, 363, 363, 362, 362, 362, 362, 362, 361, 360, 360, 360, 360, 360, 360, 359, 359, 358, 358, 358, 357, 357, 357, 357, 356, 356, 356, 356, 356, 356, 355, 355, 355, 355, 355, 355, 355, 354, 354, 354, 353, 353, 353, 353, 353, 353, 352, 352, 352, 352, 352, 352, 351, 351, 351, 351, 351, 351, 350, 350, 350, 350, 350, 350, 349, 349, 348, 348, 348, 348, 348, 348, 348, 347, 347, 347, 347, 347, 347, 347, 346, 346, 346, 345, 345, 345, 345, 345, 345, 344, 344, 344, 344, 344, 344, 343, 343, 343, 343, 342, 342, 342, 342, 341, 341, 340, 340, 340, 340, 340, 340, 339, 339, 339, 339, 339, 339, 339, 338, 338, 338, 338, 338, 338, 338, 338, 337, 337, 337, 337, 336, 336, 335, 335, 335, 335, 334, 334, 334, 334, 334, 333, 333, 333, 333, 333, 332, 332, 332, 332, 332, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 330, 330, 330, 330, 330, 329, 329, 329, 329, 329, 329, 328, 328, 328, 327, 327, 327, 326, 326, 325, 325, 325, 325, 325, 324, 324, 324, 323, 323, 323, 322, 322, 322, 322, 322, 322, 322, 322, 322, 321, 321, 320, 320, 320, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 318, 318, 318, 318, 317, 317, 316, 316, 316, 316, 316, 316, 315, 315, 315, 315, 314, 314, 314, 314, 313, 313, 313, 313, 312, 312, 311, 311, 311, 310, 310, 310, 310, 310, 309, 309, 309, 309, 309, 309, 309, 308, 308, 308, 308, 308, 308, 307, 307, 307, 307, 307, 306, 306, 306, 305, 305, 305, 305, 305, 305, 305, 305, 304, 304, 304, 304, 304, 304, 304, 303, 303, 303, 303, 303, 302, 302, 302, 302, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 299, 299, 299, 299, 299, 299, 298, 298, 298, 298, 297, 297, 297, 297, 297, 297, 297, 296, 296, 296, 295, 295, 295, 295, 295, 294, 294, 294, 294, 294, 294, 293, 293, 293, 292, 292, 292, 292, 292, 292, 292, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 290, 290, 290, 290, 290, 289, 289, 289, 289, 289, 289, 289, 288, 288, 288, 288, 288, 287, 287, 287, 287, 287, 287, 286, 286, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 284, 284, 284, 284, 284, 284, 283, 283, 283, 283, 283, 283, 283, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 281, 281, 281, 281, 281, 281, 281, 281, 280, 280, 280, 280, 280, 280, 279, 279, 279, 279, 279, 278, 278, 278, 278, 278, 278, 277, 277, 277, 277, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 275, 275, 275, 275, 274, 274, 274, 274, 274, 273, 273, 273, 273, 273, 273, 273, 273, 272, 272, 271, 271, 271, 271, 271, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 267, 267, 267, 267, 267, 267, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 264, 264, 264, 264, 264, 264, 263, 263, 263, 263, 263, 263, 262, 262, 262, 262, 262, 262, 262, 261, 261, 261, 261, 260, 260, 260, 260, 260, 260, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 258, 258, 258, 258, 258, 258, 258, 258, 257, 257, 257, 257, 257, 257, 257, 257, 257, 256, 256, 256, 256, 256, 256, 256, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108], "coloraxis": "coloraxis", "size": [13113, 9432, 6933, 4287, 3120, 3037, 2680, 2545, 2455, 2438, 2380, 2370, 2284, 2257, 2187, 2179, 2169, 2137, 2050, 2004, 1957, 1915, 1896, 1891, 1887, 1878, 1862, 1854, 1850, 1848, 1838, 1832, 1829, 1790, 1695, 1678, 1670, 1655, 1655, 1601, 1591, 1587, 1586, 1586, 1585, 1583, 1560, 1559, 1548, 1537, 1535, 1527, 1523, 1523, 1518, 1511, 1480, 1433, 1429, 1427, 1416, 1416, 1412, 1391, 1374, 1370, 1362, 1353, 1351, 1348, 1346, 1331, 1323, 1308, 1296, 1288, 1286, 1285, 1278, 1272, 1260, 1251, 1248, 1245, 1238, 1234, 1233, 1226, 1210, 1196, 1185, 1182, 1179, 1177, 1176, 1173, 1173, 1170, 1166, 1165, 1161, 1159, 1158, 1150, 1147, 1144, 1142, 1129, 1125, 1120, 1116, 1115, 1108, 1095, 1094, 1093, 1083, 1078, 1071, 1070, 1069, 1064, 1062, 1061, 1057, 1051, 1051, 1051, 1046, 1039, 1039, 1036, 1036, 1036, 1034, 1033, 1032, 1029, 1024, 1015, 1014, 1005, 1002, 999, 993, 993, 992, 983, 978, 974, 973, 972, 970, 969, 962, 960, 957, 944, 943, 941, 939, 938, 936, 935, 931, 925, 923, 919, 911, 910, 905, 901, 897, 892, 891, 889, 882, 882, 880, 880, 879, 876, 874, 871, 870, 870, 869, 868, 868, 867, 858, 858, 847, 847, 846, 845, 843, 837, 834, 832, 831, 831, 829, 827, 823, 822, 822, 818, 811, 807, 805, 804, 799, 796, 795, 792, 788, 788, 784, 781, 780, 778, 778, 778, 776, 773, 771, 770, 766, 761, 761, 761, 754, 753, 752, 752, 751, 751, 750, 750, 748, 747, 743, 742, 741, 740, 737, 737, 735, 735, 734, 733, 733, 731, 731, 730, 724, 724, 722, 721, 721, 720, 718, 716, 715, 713, 713, 712, 708, 707, 705, 704, 697, 697, 697, 691, 687, 685, 684, 683, 682, 682, 678, 674, 672, 672, 672, 670, 668, 668, 668, 666, 666, 666, 665, 665, 664, 663, 662, 661, 660, 660, 657, 655, 654, 652, 651, 649, 649, 648, 648, 647, 644, 643, 643, 642, 641, 641, 640, 637, 637, 637, 636, 634, 634, 633, 632, 629, 628, 628, 626, 626, 626, 626, 625, 625, 625, 625, 622, 621, 619, 619, 618, 618, 618, 617, 616, 615, 615, 614, 614, 611, 611, 610, 610, 607, 605, 604, 602, 601, 599, 598, 597, 597, 596, 596, 596, 595, 594, 592, 592, 591, 590, 589, 589, 589, 587, 587, 583, 583, 582, 581, 581, 580, 580, 580, 580, 579, 579, 578, 578, 577, 576, 576, 575, 571, 570, 569, 566, 566, 565, 564, 564, 561, 560, 559, 559, 558, 557, 556, 556, 555, 554, 554, 554, 554, 552, 552, 552, 551, 549, 549, 547, 547, 547, 546, 546, 546, 546, 545, 545, 544, 544, 544, 544, 543, 541, 541, 541, 540, 539, 537, 537, 537, 536, 536, 536, 535, 535, 535, 534, 533, 533, 533, 532, 531, 530, 530, 530, 530, 527, 526, 525, 525, 524, 524, 524, 523, 522, 522, 521, 520, 516, 515, 515, 514, 514, 514, 514, 513, 513, 513, 511, 511, 511, 510, 510, 509, 509, 508, 503, 503, 503, 502, 502, 502, 502, 501, 501, 501, 500, 499, 498, 497, 497, 496, 496, 493, 492, 492, 491, 491, 490, 488, 487, 487, 487, 485, 485, 484, 484, 483, 483, 482, 482, 482, 482, 480, 480, 480, 480, 479, 478, 478, 478, 475, 475, 474, 474, 474, 474, 471, 470, 470, 469, 469, 469, 467, 467, 467, 464, 464, 464, 463, 463, 463, 463, 462, 462, 460, 459, 459, 459, 458, 457, 457, 456, 456, 456, 456, 455, 455, 455, 454, 454, 454, 454, 453, 453, 452, 452, 451, 450, 450, 450, 450, 449, 449, 449, 448, 448, 448, 448, 446, 446, 446, 445, 445, 445, 443, 443, 442, 441, 440, 440, 440, 439, 438, 438, 438, 438, 437, 437, 437, 436, 436, 435, 435, 435, 435, 435, 435, 433, 433, 432, 431, 430, 430, 430, 429, 429, 429, 429, 428, 428, 428, 427, 426, 425, 425, 424, 424, 423, 421, 421, 420, 419, 419, 418, 418, 418, 418, 418, 417, 417, 416, 415, 415, 415, 415, 415, 415, 414, 414, 414, 414, 414, 413, 413, 413, 413, 413, 413, 412, 412, 411, 410, 410, 410, 409, 408, 408, 408, 407, 407, 406, 406, 406, 406, 405, 405, 405, 403, 403, 402, 402, 402, 401, 401, 401, 401, 400, 399, 399, 399, 399, 399, 398, 398, 397, 397, 397, 396, 396, 396, 396, 396, 395, 395, 395, 395, 394, 394, 394, 393, 393, 393, 392, 392, 392, 392, 392, 392, 392, 392, 392, 391, 390, 390, 390, 389, 389, 389, 389, 389, 388, 388, 388, 388, 387, 387, 387, 386, 386, 386, 385, 385, 385, 385, 384, 384, 383, 383, 382, 382, 381, 381, 381, 380, 379, 379, 379, 379, 379, 379, 378, 378, 378, 378, 376, 376, 376, 376, 375, 375, 375, 375, 375, 374, 374, 374, 374, 373, 371, 371, 371, 371, 371, 371, 370, 370, 369, 369, 369, 369, 368, 368, 368, 368, 368, 368, 367, 366, 366, 366, 365, 365, 365, 365, 364, 364, 364, 363, 363, 363, 363, 363, 362, 362, 362, 362, 362, 361, 360, 360, 360, 360, 360, 360, 359, 359, 358, 358, 358, 357, 357, 357, 357, 356, 356, 356, 356, 356, 356, 355, 355, 355, 355, 355, 355, 355, 354, 354, 354, 353, 353, 353, 353, 353, 353, 352, 352, 352, 352, 352, 352, 351, 351, 351, 351, 351, 351, 350, 350, 350, 350, 350, 350, 349, 349, 348, 348, 348, 348, 348, 348, 348, 347, 347, 347, 347, 347, 347, 347, 346, 346, 346, 345, 345, 345, 345, 345, 345, 344, 344, 344, 344, 344, 344, 343, 343, 343, 343, 342, 342, 342, 342, 341, 341, 340, 340, 340, 340, 340, 340, 339, 339, 339, 339, 339, 339, 339, 338, 338, 338, 338, 338, 338, 338, 338, 337, 337, 337, 337, 336, 336, 335, 335, 335, 335, 334, 334, 334, 334, 334, 333, 333, 333, 333, 333, 332, 332, 332, 332, 332, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 330, 330, 330, 330, 330, 329, 329, 329, 329, 329, 329, 328, 328, 328, 327, 327, 327, 326, 326, 325, 325, 325, 325, 325, 324, 324, 324, 323, 323, 323, 322, 322, 322, 322, 322, 322, 322, 322, 322, 321, 321, 320, 320, 320, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 318, 318, 318, 318, 317, 317, 316, 316, 316, 316, 316, 316, 315, 315, 315, 315, 314, 314, 314, 314, 313, 313, 313, 313, 312, 312, 311, 311, 311, 310, 310, 310, 310, 310, 309, 309, 309, 309, 309, 309, 309, 308, 308, 308, 308, 308, 308, 307, 307, 307, 307, 307, 306, 306, 306, 305, 305, 305, 305, 305, 305, 305, 305, 304, 304, 304, 304, 304, 304, 304, 303, 303, 303, 303, 303, 302, 302, 302, 302, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 299, 299, 299, 299, 299, 299, 298, 298, 298, 298, 297, 297, 297, 297, 297, 297, 297, 296, 296, 296, 295, 295, 295, 295, 295, 294, 294, 294, 294, 294, 294, 293, 293, 293, 292, 292, 292, 292, 292, 292, 292, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 290, 290, 290, 290, 290, 289, 289, 289, 289, 289, 289, 289, 288, 288, 288, 288, 288, 287, 287, 287, 287, 287, 287, 286, 286, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 284, 284, 284, 284, 284, 284, 283, 283, 283, 283, 283, 283, 283, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 281, 281, 281, 281, 281, 281, 281, 281, 280, 280, 280, 280, 280, 280, 279, 279, 279, 279, 279, 278, 278, 278, 278, 278, 278, 277, 277, 277, 277, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 275, 275, 275, 275, 274, 274, 274, 274, 274, 273, 273, 273, 273, 273, 273, 273, 273, 272, 272, 271, 271, 271, 271, 271, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 267, 267, 267, 267, 267, 267, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 264, 264, 264, 264, 264, 264, 263, 263, 263, 263, 263, 263, 262, 262, 262, 262, 262, 262, 262, 261, 261, 261, 261, 260, 260, 260, 260, 260, 260, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 258, 258, 258, 258, 258, 258, 258, 258, 257, 257, 257, 257, 257, 257, 257, 257, 257, 256, 256, 256, 256, 256, 256, 256, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108], "sizemode": "area", "sizeref": 32.7825}, "mode": "markers", "name": "", "showlegend": false, "subplot": "mapbox", "type": "scattermapbox"}],                        {"coloraxis": {"colorbar": {"title": {"text": "count"}}, "colorscale": [[0.0, "#000000"], [0.0625, "#001f4d"], [0.125, "#003786"], [0.1875, "#0e58a8"], [0.25, "#217eb8"], [0.3125, "#30a4ca"], [0.375, "#54c8df"], [0.4375, "#9be4ef"], [0.5, "#e1e9d1"], [0.5625, "#f3d573"], [0.625, "#e7b000"], [0.6875, "#da8200"], [0.75, "#c65400"], [0.8125, "#ac2301"], [0.875, "#820000"], [0.9375, "#4c0000"], [1.0, "#000000"]]}, "height": 600, "legend": {"itemsizing": "constant", "tracegroupgap": 0}, "mapbox": {"center": {"lat": 41.84742536411974, "lon": -87.66119091168241}, "domain": {"x": [0.0, 1.0], "y": [0.0, 1.0]}, "style": "open-street-map", "zoom": 9.5}, "margin": {"b": 0, "l": 0, "r": 0, "t": 0}, "template": {"data": {"bar": [{"error_x": {"color": "#2a3f5f"}, "error_y": {"color": "#2a3f5f"}, "marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "bar"}], "barpolar": [{"marker": {"line": {"color": "#E5ECF6", "width": 0.5}}, "type": "barpolar"}], "carpet": [{"aaxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "baxis": {"endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f"}, "type": "carpet"}], "choropleth": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "choropleth"}], "contour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "contour"}], "contourcarpet": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "contourcarpet"}], "heatmap": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmap"}], "heatmapgl": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmapgl"}], "histogram": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "histogram"}], "histogram2d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2d"}], "histogram2dcontour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2dcontour"}], "mesh3d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "mesh3d"}], "parcoords": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "parcoords"}], "pie": [{"automargin": true, "type": "pie"}], "scatter": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter"}], "scatter3d": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter3d"}], "scattercarpet": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattercarpet"}], "scattergeo": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergeo"}], "scattergl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergl"}], "scattermapbox": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermapbox"}], "scatterpolar": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolar"}], "scatterpolargl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolargl"}], "scatterternary": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterternary"}], "surface": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "surface"}], "table": [{"cells": {"fill": {"color": "#EBF0F8"}, "line": {"color": "white"}}, "header": {"fill": {"color": "#C8D4E3"}, "line": {"color": "white"}}, "type": "table"}]}, "layout": {"annotationdefaults": {"arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1}, "coloraxis": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "colorscale": {"diverging": [[0, "#8e0152"], [0.1, "#c51b7d"], [0.2, "#de77ae"], [0.3, "#f1b6da"], [0.4, "#fde0ef"], [0.5, "#f7f7f7"], [0.6, "#e6f5d0"], [0.7, "#b8e186"], [0.8, "#7fbc41"], [0.9, "#4d9221"], [1, "#276419"]], "sequential": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "sequentialminus": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]]}, "colorway": ["#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52"], "font": {"color": "#2a3f5f"}, "geo": {"bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white"}, "hoverlabel": {"align": "left"}, "hovermode": "closest", "mapbox": {"style": "light"}, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": {"angularaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "radialaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "scene": {"xaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "yaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}, "zaxis": {"backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white"}}, "shapedefaults": {"line": {"color": "#2a3f5f"}}, "ternary": {"aaxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "baxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}, "bgcolor": "#E5ECF6", "caxis": {"gridcolor": "white", "linecolor": "white", "ticks": ""}}, "title": {"x": 0.05}, "xaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}, "yaxis": {"automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "white", "zerolinewidth": 2}}}},                        {"responsive": true}                    )                };                </script>        </div>'

RDDs

RDDs setup

In [127]:
# Get sparkContext
sc = spark.sparkContext
In [128]:
sc
Out[128]:

SparkContext

Spark UI

Version
v2.4.5
Master
local[*]
AppName
pyspark-shell
In [129]:
psrdd = sc.textFile('data/police-stations.csv')
psrdd.first()
Out[129]:
'DISTRICT,DISTRICT NAME,ADDRESS,CITY,STATE,ZIP,WEBSITE,PHONE,FAX,TTY,X COORDINATE,Y COORDINATE,LATITUDE,LONGITUDE,LOCATION'
In [130]:
psrddHeader = psrdd.first()
In [131]:
psrddRest = psrdd.filter(lambda line: line!=psrddHeader)
psrddRest.first()
Out[131]:
'Headquarters,Headquarters,3510 S Michigan Ave,Chicago,IL,60653,http://home.chicagopolice.org,,,,1177731.401,1881697.404,41.83070169,-87.62339535,"(41.8307016873, -87.6233953459)"'

How many police stations are there?

In [132]:
psrddRest.map(lambda line: line.split(',')).collect()
Out[132]:
[['Headquarters',
  'Headquarters',
  '3510 S Michigan Ave',
  'Chicago',
  'IL',
  '60653',
  'http://home.chicagopolice.org',
  '',
  '',
  '',
  '1177731.401',
  '1881697.404',
  '41.83070169',
  '-87.62339535',
  '"(41.8307016873',
  ' -87.6233953459)"'],
 ['1',
  'Central',
  '1718 S State St',
  'Chicago',
  'IL',
  '60616',
  'http://home.chicagopolice.org/community/districts/1st-district-central/',
  '312-745-4290',
  '312-745-3694',
  '312-745-3693',
  '1176569.052',
  '1891771.704',
  '41.85837259',
  '-87.62735617',
  '"(41.8583725929',
  ' -87.627356171)"'],
 ['6',
  'Gresham',
  '7808 S Halsted St',
  'Chicago',
  'IL',
  '60620',
  'http://home.chicagopolice.org/community/districts/6th-district-gresham/',
  '312-745-3617',
  '312-745-3649',
  '312-745-3639',
  '1172283.013',
  '1853022.646',
  '41.75213684',
  '-87.64422891',
  '"(41.7521368378',
  ' -87.6442289066)"'],
 ['11',
  'Harrison',
  '3151 W Harrison St',
  'Chicago',
  'IL',
  '60612',
  'http://home.chicagopolice.org/community/districts/11th-district-harrison/',
  '312-746-8386',
  '312-746-4281',
  '312-746-5151',
  '1155244.069',
  '1897148.755',
  '41.87358229',
  '-87.70548813',
  '"(41.8735822883',
  ' -87.705488126)"'],
 ['16',
  'Jefferson Park',
  '5151 N Milwaukee Ave',
  'Chicago',
  'IL',
  '60630',
  'http://home.chicagopolice.org/community/districts/16th-district-jefferson-park/',
  '312-742-4480',
  '312-742-4421',
  '312-742-4423',
  '1138480.758',
  '1933660.473',
  '41.97409445',
  '-87.76614884',
  '"(41.9740944511',
  ' -87.7661488432)"'],
 ['24',
  'Rogers Park',
  '6464 N Clark St',
  'Chicago',
  'IL',
  '60626',
  'http://home.chicagopolice.org/community/districts/24th-district-rogers-park/',
  '312-744-5907',
  '312-744-6928',
  '312-744-7603',
  '1164193.588',
  '1943199.401',
  '41.99976348',
  '-87.67132429',
  '"(41.9997634842',
  ' -87.6713242922)"'],
 ['2',
  'Wentworth',
  '5101 S Wentworth Ave',
  'Chicago',
  'IL',
  '60609',
  'http://home.chicagopolice.org/community/districts/2nd-district-wentworth/',
  '312-747-8366',
  '312-747-5396',
  '312-747-6656',
  '1175864.837',
  '1871153.753',
  '41.80181109',
  '-87.63056018',
  '"(41.8018110912',
  ' -87.6305601801)"'],
 ['7',
  'Englewood',
  '1438 W 63rd St',
  'Chicago',
  'IL',
  '60636',
  'http://home.chicagopolice.org/community/districts/7th-district-englewood/',
  '312-747-8223',
  '312-747-6558',
  '312-747-6652',
  '1167659.235',
  '1863005.522',
  '41.77963154',
  '-87.66088702',
  '"(41.7796315359',
  ' -87.6608870173)"'],
 ['25',
  'Grand Central',
  '5555 W Grand Ave',
  'Chicago',
  'IL',
  '60639',
  'http://home.chicagopolice.org/community/districts/25th-district-grand-central/',
  '312-746-8605',
  '312-746-4353',
  '312-746-8383',
  '1138770.871',
  '1913442.439',
  '41.91860889',
  '-87.76557448',
  '"(41.9186088912',
  ' -87.765574479)"'],
 ['10',
  'Ogden',
  '3315 W Ogden Ave',
  'Chicago',
  'IL',
  '60623',
  'http://home.chicagopolice.org/community/districts/10th-district-ogden/',
  '312-747-7511',
  '312-747-7429',
  '312-747-7471',
  '1154500.753',
  '1890985.501',
  '41.85668453',
  '-87.70838196',
  '"(41.8566845327',
  ' -87.708381958)"'],
 ['15',
  'Austin',
  '5701 W Madison St',
  'Chicago',
  'IL',
  '60644',
  'http://home.chicagopolice.org/community/districts/15th-district-austin/',
  '312-743-1440',
  '312-743-1366',
  '312-743-1485',
  '1138148.815',
  '1899399.078',
  '41.88008346',
  '-87.76819989',
  '"(41.8800834614',
  ' -87.768199889)"'],
 ['3',
  'Grand Crossing',
  '7040 S Cottage Grove Ave',
  'Chicago',
  'IL',
  '60637',
  'http://home.chicagopolice.org/community/districts/3rd-district-grand-crossing/',
  '312-747-8201',
  '312-747-5479',
  '312-747-9168',
  '1182739.183',
  '1858317.732',
  '41.76643089',
  '-87.60574786',
  '"(41.7664308925',
  ' -87.6057478606)"'],
 ['19',
  'Town Hall',
  '850 W Addison St',
  'Chicago',
  'IL',
  '60613',
  'http://home.chicagopolice.org/community/districts/19th-district-town-hall/',
  '312-744-8320',
  '312-744-4481',
  '312-744-8011',
  '1169730.744',
  '1924160.317',
  '41.94740046',
  '-87.65151202',
  '"(41.9474004564',
  ' -87.651512018)"'],
 ['14',
  'Shakespeare',
  '2150 N California Ave',
  'Chicago',
  'IL',
  '60647',
  'http://home.chicagopolice.org/community/districts/14th-district-shakespeare/',
  '312-744-8250',
  '312-744-2422',
  '312-744-8260',
  '1157304.426',
  '1914481.521',
  '41.92110332',
  '-87.69745182',
  '"(41.9211033246',
  ' -87.6974518223)"'],
 ['8',
  'Chicago Lawn',
  '3420 W 63rd St',
  'Chicago',
  'IL',
  '60629',
  'http://home.chicagopolice.org/community/districts/8th-district-chicago-lawn/',
  '312-747-8730',
  '312-747-8545',
  '312-747-8116',
  '1154575.242',
  '1862672.049',
  '41.77898719',
  '-87.70886382',
  '"(41.778987189',
  ' -87.7088638153)"'],
 ['4',
  'South Chicago',
  '2255 E 103rd St',
  'Chicago',
  'IL',
  '60617',
  'http://home.chicagopolice.org/community/districts/4th-district-south-chicago/',
  '312-747-7581',
  '312-747-5276',
  '312-747-9169',
  '1193131.299',
  '1837090.265',
  '41.70793329',
  '-87.56834912',
  '"(41.7079332906',
  ' -87.5683491228)"'],
 ['20',
  'Lincoln',
  '5400 N Lincoln Ave',
  'Chicago',
  'IL',
  '60625',
  'http://home.chicagopolice.org/community/districts/20th-district-lincoln/',
  '312-742-8714',
  '312-742-8803',
  '312-742-8841',
  '1158399.146',
  '1935788.826',
  '41.97954951',
  '-87.69284451',
  '"(41.9795495131',
  ' -87.6928445094)"'],
 ['18',
  'Near North',
  '1160 N Larrabee St',
  'Chicago',
  'IL',
  '60610',
  'http://home.chicagopolice.org/community/districts/18th-district-near-north/',
  '312-742-5870',
  '312-742-5771',
  '312-742-5773',
  '1172080.029',
  '1908086.527',
  '41.90324165',
  '-87.64335214',
  '"(41.9032416531',
  ' -87.6433521393)"'],
 ['12', 'Near West', '"1412 S Blue Island Ave'],
 ['"',
  'Chicago',
  'IL',
  '60608',
  'http://home.chicagopolice.org/community/districts/12th-district-near-west/',
  '312-746-8396',
  '312-746-4248',
  '312-746-9868',
  '1168487.845',
  '1893384.455',
  '41.86297662',
  '-87.65697251',
  '"(41.8629766244',
  ' -87.6569725149)"'],
 ['9',
  'Deering',
  '3120 S Halsted St',
  'Chicago',
  'IL',
  '60608',
  'http://home.chicagopolice.org/community/districts/9th-district-deering/',
  '312-747-8227',
  '312-747-5329',
  '312-747-9172',
  '1171440.24',
  '1884085.224',
  '41.83739443',
  '-87.64640771',
  '"(41.8373944311',
  ' -87.6464077068)"'],
 ['22',
  'Morgan Park',
  '1900 W Monterey Ave',
  'Chicago',
  'IL',
  '60643',
  'http://home.chicagopolice.org/community/districts/22nd-district-morgan-park/',
  '312-745-0710',
  '312-745-0814',
  '312-745-0569',
  '1165825.476',
  '1830851.333',
  '41.69143478',
  '-87.66852039',
  '"(41.6914347795',
  ' -87.6685203937)"'],
 ['5',
  'Calumet',
  '727 E 111th St',
  'Chicago',
  'IL',
  '60628',
  'http://home.chicagopolice.org/community/districts/5th-district-calumet/',
  '312-747-8210',
  '312-747-5935',
  '312-747-9170',
  '1183305.427',
  '1831462.313',
  '41.69272336',
  '-87.60450587',
  '"(41.6927233639',
  ' -87.6045058667)"'],
 ['17',
  'Albany Park',
  '4650 N Pulaski Rd',
  'Chicago',
  'IL',
  '60630',
  'http://home.chicagopolice.org/community/districts/17th-district-albany-park/',
  '312-742-4410',
  '312-742-5411',
  '312-742-5451',
  '1148843.91',
  '1930801.058',
  '41.96605342',
  '-87.72811456',
  '"(41.9660534171',
  ' -87.728114561)"']]
In [133]:
psrddRest.map(lambda line: line.split(',')).count()
Out[133]:
24

Display the District ID, District name, Address and Zip for the police station with District ID 7

In [134]:
psrddRest.filter(lambda line: line.split(',')[0] == 7).collect()
Out[134]:
[]
In [135]:
(psrddRest.filter(lambda line: line.split(',')[0] == 7).
        map(lambda line: (line.split(',')[0], 
                            line.split(',')[1],
                            line.split(',')[2],
                            line.split(',')[5]
            )).collect())
Out[135]:
[]

Police stations 10 and 11 are geographically close to each other. Display the District ID, District name, address and zip code

In [136]:
(psrddRest.filter(lambda line: line.split(',')[0] in ['10', '11']).
    map(lambda line: (line.split(',')[1], 
                        line.split(',')[2],
                           line.split(',')[5])).collect())
Out[136]:
[('Harrison', '3151 W Harrison St', '60612'),
 ('Ogden', '3315 W Ogden Ave', '60623')]

Visualisation

In [137]:
import plotly.figure_factory as ff

import numpy as np
import pandas as pd

df_sample = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/minoritymajority.csv')
df_sample_r = df_sample[df_sample['STNAME'] == 'California']

values = df_sample_r['TOT_POP'].tolist()
fips = df_sample_r['FIPS'].tolist()

colorscale = [
    'rgb(193, 193, 193)',
    'rgb(239,239,239)',
    'rgb(195, 196, 222)',
    'rgb(144,148,194)',
    'rgb(101,104,168)',
    'rgb(65, 53, 132)'
]

fig = ff.create_choropleth(
    fips=fips, values=values, scope=['CA', 'AZ', 'Nevada', 'Oregon', ' Idaho'],
    binning_endpoints=[14348, 63983, 134827, 426762, 2081313], colorscale=colorscale,
    county_outline={'color': 'rgb(255,255,255)', 'width': 0.5}, round_legend_values=True,
    legend_title='Population by County', title='California and Nearby States'
)
fig.layout.template = None
fig.show()
In [138]:
help(ff.create_choropleth)
Help on function create_choropleth in module plotly.figure_factory._county_choropleth:

create_choropleth(fips, values, scope=['usa'], binning_endpoints=None, colorscale=None, order=None, simplify_county=0.02, simplify_state=0.02, asp=None, show_hover=True, show_state_data=True, state_outline=None, county_outline=None, centroid_marker=None, round_legend_values=False, exponent_format=False, legend_title='', **layout_options)
    Returns figure for county choropleth. Uses data from package_data.
    
    :param (list) fips: list of FIPS values which correspond to the con
        catination of state and county ids. An example is '01001'.
    :param (list) values: list of numbers/strings which correspond to the
        fips list. These are the values that will determine how the counties
        are colored.
    :param (list) scope: list of states and/or states abbreviations. Fits
        all states in the camera tightly. Selecting ['usa'] is the equivalent
        of appending all 50 states into your scope list. Selecting only 'usa'
        does not include 'Alaska', 'Puerto Rico', 'American Samoa',
        'Commonwealth of the Northern Mariana Islands', 'Guam',
        'United States Virgin Islands'. These must be added manually to the
        list.
        Default = ['usa']
    :param (list) binning_endpoints: ascending numbers which implicitly define
        real number intervals which are used as bins. The colorscale used must
        have the same number of colors as the number of bins and this will
        result in a categorical colormap.
    :param (list) colorscale: a list of colors with length equal to the
        number of categories of colors. The length must match either all
        unique numbers in the 'values' list or if endpoints is being used, the
        number of categories created by the endpoints.
    
        For example, if binning_endpoints = [4, 6, 8], then there are 4 bins:
        [-inf, 4), [4, 6), [6, 8), [8, inf)
    :param (list) order: a list of the unique categories (numbers/bins) in any
        desired order. This is helpful if you want to order string values to
        a chosen colorscale.
    :param (float) simplify_county: determines the simplification factor
        for the counties. The larger the number, the fewer vertices and edges
        each polygon has. See
        http://toblerity.org/shapely/manual.html#object.simplify for more
        information.
        Default = 0.02
    :param (float) simplify_state: simplifies the state outline polygon.
        See http://toblerity.org/shapely/manual.html#object.simplify for more
        information.
        Default = 0.02
    :param (float) asp: the width-to-height aspect ratio for the camera.
        Default = 2.5
    :param (bool) show_hover: show county hover and centroid info
    :param (bool) show_state_data: reveals state boundary lines
    :param (dict) state_outline: dict of attributes of the state outline
        including width and color. See
        https://plot.ly/python/reference/#scatter-marker-line for all valid
        params
    :param (dict) county_outline: dict of attributes of the county outline
        including width and color. See
        https://plot.ly/python/reference/#scatter-marker-line for all valid
        params
    :param (dict) centroid_marker: dict of attributes of the centroid marker.
        The centroid markers are invisible by default and appear visible on
        selection. See https://plot.ly/python/reference/#scatter-marker for
        all valid params
    :param (bool) round_legend_values: automatically round the numbers that
        appear in the legend to the nearest integer.
        Default = False
    :param (bool) exponent_format: if set to True, puts numbers in the K, M,
        B number format. For example 4000.0 becomes 4.0K
        Default = False
    :param (str) legend_title: title that appears above the legend
    :param **layout_options: a **kwargs argument for all layout parameters
    
    
    Example 1: Florida:: 
    
        import plotly.plotly as py
        import plotly.figure_factory as ff
    
        import numpy as np
        import pandas as pd
    
        df_sample = pd.read_csv(
            'https://raw.githubusercontent.com/plotly/datasets/master/minoritymajority.csv'
        )
        df_sample_r = df_sample[df_sample['STNAME'] == 'Florida']
    
        values = df_sample_r['TOT_POP'].tolist()
        fips = df_sample_r['FIPS'].tolist()
    
        binning_endpoints = list(np.mgrid[min(values):max(values):4j])
        colorscale = ["#030512","#1d1d3b","#323268","#3d4b94","#3e6ab0",
                    "#4989bc","#60a7c7","#85c5d3","#b7e0e4","#eafcfd"]
        fig = ff.create_choropleth(
            fips=fips, values=values, scope=['Florida'], show_state_data=True,
            colorscale=colorscale, binning_endpoints=binning_endpoints,
            round_legend_values=True, plot_bgcolor='rgb(229,229,229)',
            paper_bgcolor='rgb(229,229,229)', legend_title='Florida Population',
            county_outline={'color': 'rgb(255,255,255)', 'width': 0.5},
            exponent_format=True,
        )
    
    Example 2: New England
    ```
    import plotly.plotly as py
    import plotly.figure_factory as ff
    
    import pandas as pd
    
    NE_states = ['Connecticut', 'Maine', 'Massachusetts',
                 'New Hampshire', 'Rhode Island']
    df_sample = pd.read_csv(
        'https://raw.githubusercontent.com/plotly/datasets/master/minoritymajority.csv'
    )
    df_sample_r = df_sample[df_sample['STNAME'].isin(NE_states)]
    colorscale = ['rgb(68.0, 1.0, 84.0)',
     'rgb(66.0, 64.0, 134.0)',
     'rgb(38.0, 130.0, 142.0)',
     'rgb(63.0, 188.0, 115.0)',
     'rgb(216.0, 226.0, 25.0)']
    
    values = df_sample_r['TOT_POP'].tolist()
    fips = df_sample_r['FIPS'].tolist()
    fig = ff.create_choropleth(
        fips=fips, values=values, scope=NE_states, show_state_data=True
    )
    py.iplot(fig, filename='choropleth_new_england')
    ```
    
    Example 3: California and Surrounding States
    ```
    import plotly.plotly as py
    import plotly.figure_factory as ff
    
    import pandas as pd
    
    df_sample = pd.read_csv(
        'https://raw.githubusercontent.com/plotly/datasets/master/minoritymajority.csv'
    )
    df_sample_r = df_sample[df_sample['STNAME'] == 'California']
    
    values = df_sample_r['TOT_POP'].tolist()
    fips = df_sample_r['FIPS'].tolist()
    
    colorscale = [
        'rgb(193, 193, 193)',
        'rgb(239,239,239)',
        'rgb(195, 196, 222)',
        'rgb(144,148,194)',
        'rgb(101,104,168)',
        'rgb(65, 53, 132)'
    ]
    
    fig = ff.create_choropleth(
        fips=fips, values=values, colorscale=colorscale,
        scope=['CA', 'AZ', 'Nevada', 'Oregon', ' Idaho'],
        binning_endpoints=[14348, 63983, 134827, 426762, 2081313],
        county_outline={'color': 'rgb(255,255,255)', 'width': 0.5},
        legend_title='California Counties',
        title='California and Nearby States'
    )
    py.iplot(fig, filename='choropleth_california_and_surr_states_outlines')
    ```
    
    Example 4: USA
    ```
    import plotly.plotly as py
    import plotly.figure_factory as ff
    
    import numpy as np
    import pandas as pd
    
    df_sample = pd.read_csv(
        'https://raw.githubusercontent.com/plotly/datasets/master/laucnty16.csv'
    )
    df_sample['State FIPS Code'] = df_sample['State FIPS Code'].apply(
        lambda x: str(x).zfill(2)
    )
    df_sample['County FIPS Code'] = df_sample['County FIPS Code'].apply(
        lambda x: str(x).zfill(3)
    )
    df_sample['FIPS'] = (
        df_sample['State FIPS Code'] + df_sample['County FIPS Code']
    )
    
    binning_endpoints = list(np.linspace(1, 12, len(colorscale) - 1))
    colorscale = ["#f7fbff", "#ebf3fb", "#deebf7", "#d2e3f3", "#c6dbef",
                  "#b3d2e9", "#9ecae1", "#85bcdb", "#6baed6", "#57a0ce",
                  "#4292c6", "#3082be", "#2171b5", "#1361a9", "#08519c",
                  "#0b4083","#08306b"]
    fips = df_sample['FIPS']
    values = df_sample['Unemployment Rate (%)']
    fig = ff.create_choropleth(
        fips=fips, values=values, scope=['usa'],
        binning_endpoints=binning_endpoints, colorscale=colorscale,
        show_hover=True, centroid_marker={'opacity': 0},
        asp=2.9, title='USA by Unemployment %',
        legend_title='Unemployment %'
    )
    
    py.iplot(fig, filename='choropleth_full_usa')
    ```